JavaScript的原型
JavaScript
这个名词最初就是因为Java
太火了,为了蹭Java
的热度所以起的名字,并且JavaScript
的管理层要求它去模仿Java
,所以他有很多地方跟Java
相像,但是因为他们的设计不一样,所以在我学习的时候会有很多迷惑的地方,比如这里原型的概念。
Java、C++
这一类的语言属于基于类
的编程语言。这种类型的编程语言关注分类和类之间关系的开发模型,在这种语言中,总是先有类,再通过类实例化一个对象,类之间可以有继承,组合之类的关系。
而JavaScript
是属于基于原型
的编程语言,更加关注对象实例的行为,是通过"复制操作"创建一个新对象。并不是真正的去复制一个原型对象,而是使新对象持有一个原型的引用。
抛去模拟Java类的操作语法(new、Function Object等),JavaScript的原型系统可以简单的来说就是对象的私有字段[[prototype]]就是对象的原型,读取一个属性,如果对象本身没有,就会访问对象的原型,直到找到或者原型为空为止。
在ES6之后,我们可以通过一些内置函数来才操纵原型:
Object.create
根据指定的原型创建新对象Object.getPrototypeOf
获得一个对象的原型Object.setPrototypeOf
设置一个对象的原型
JavaScript的对象
可以分为这么几类
宿主对象(host Objects):
由JavaScript宿主环境提供的对象,这些对象的行为完全由宿主环境决定内置对象(Built-in objects):
由JavaScript语言提供的对象固有对象(Intrinsic Objects):
由标准规定,随着JavaScript运行时创建而自动创建的对象实例
原生对象(Native Objects):
可以由用户通过Array,Date等内置构造器或者特殊语法创建的对象普通对象(Ordinary Objects):
由{}语法、Object构造器或者class关键字定义类创建的对象,能够被原型继承。
宿主对象
宿主对象(Host Objects)是指由宿主环境(如浏览器或Node.js)提供的对象。这些对象不是ECMAScript规范中定义的对象,而是由特定的宿主环境定义和提供的。因此,宿主对象的特性和行为可能会有所不同,取决于它们所嵌入的环境。
-
浏览器环境中的宿主对象:
- Window对象: 表示浏览器窗口或标签页。全局作用域中的变量和函数都是Window对象的属性和方法。
- Document对象: 表示HTML文档,提供对文档内容的访问和操作。
- Navigator对象: 提供有关浏览器的信息,如用户代理字符串等。
- XMLHttpRequest对象: 用于在后台与服务器交换数据,是AJAX操作的基础。
- Event对象: 表示事件,例如鼠标点击或键盘按键。
-
Node.js环境中的宿主对象:
- Global对象: 在Node.js中代表全局命名空间,类似于浏览器环境中的Window对象。
- Process对象: 提供与当前进程相关的信息和控制。
- Buffer对象: 用于处理二进制数据。
- Module对象: 表示模块,用于导出和导入模块中的内容。
内置对象
是指由语言规范定义的对象,这些对象在任何支持JavaScript的环境中都是可用的。
固有对象
在JavaScript中,固有对象(Intrinsic Objects)是指与JavaScript语言紧密相关、由JavaScript引擎提供并在所有环境中可用的对象。这些对象直接由JavaScript引擎实现,而不是由宿主环境(如浏览器或Node.js)提供。固有对象通常是ECMAScript规范的一部分,因此在所有JavaScript环境中都是一致的。
以下是一些常见的固有对象及其一些基本方法的简单表格表示:
对象 | 描述 | 一些方法 |
---|---|---|
Object | 所有对象的基础,包括一些基本的对象操作方法。 | Object.create() , Object.defineProperty() |
Function | 表示JavaScript中的函数。 | Function.prototype.call() , Function.prototype.apply() |
Array | 用于表示数组。 | Array.prototype.forEach() , Array.prototype.map() |
String | 用于表示字符串。 | String.prototype.length , String.prototype.indexOf() |
Boolean | 表示布尔值。 | - |
Number | 表示数字。 | Number.prototype.toFixed() , Number.prototype.toString() |
Symbol | 表示唯一的标识符。 | - |
Error | 表示运行时错误的基础对象。 | Error.prototype.message , Error.prototype.stack |
RegExp | 表示正则表达式。 | RegExp.prototype.test() , RegExp.prototype.exec() |
Date | 用于处理日期和时间。 | Date.prototype.getDate() , Date.prototype.setTime() |
原生对象
指的是由语言规范定义的内置对象和用户定义的对象,这两者都是由 JavaScript 本身提供的。与"宿主对象"不同,原生对象并不依赖于宿主环境,它们是 JavaScript 语言本身的一部分。
原生对象包括 ECMAScript 规范中定义的内置对象(如 Array、Object、Function 等)以及用户在代码中创建的对象。
-
内置对象: 上面举了一些例子
-
用户定义的对象:
- 自定义构造函数: 可以使用构造函数创建自定义对象。例如,通过构造函数可以创建具有特定属性和方法的对象。
jsfunction Person(name, age) { this.name = name; this.age = age; } const person1 = new Person("Alice", 25);
- 字面量方式创建对象: 使用对象字面量
{}
可以直接创建对象。
jsconst car = { brand: "Toyota", model: "Camry", year: 2022, };
普通对象
是 JavaScript 中最基本、最常见的对象类型之一。它们是由对象字面量({}
)或 Object
构造函数创建的对象。普通对象不属于特殊的对象类型(如数组、函数、正则表达式等),而是用于存储键值对的一般用途对象。
创建普通对象的方式有两种:
- 对象字面量: 使用花括号
{}
直接创建对象。
js
const person = {
name: "John",
age: 30,
job: "Developer"
};
- Object 构造函数: 使用
new Object()
构造函数创建对象。
js
const person = new Object();
person.name = "John";
person.age = 30;
person.job = "Developer";