JS-理解原型对象

无论什么时候,只要创建一个新函数,就会为函数创建一个 prototype 属性指针,指向函数的原型对象

默认情况下,所有原型对象都会自动获得一个 constructor (构造函数)属性指针,指向 prototype 属性所在函数

新建一个的自定义构造函数,其propotype 属性指针代表的原型对象只会有一个 constructor (构造函数)属性指针;其他方法都是从 Object 继承来的。

当使用构造函数创建一个实例后,实例会包含一个指针 [[Prototype]];JS 中没有标准方法访问[[Prototype]],但是现代浏览器提供了 __proto__ 属性支持,属于实例构造函数的原型对象之间的链接。

function Parent() {}

// 通过构造函数创建实例
var child = new Parent();

// 检验原型对象一致性
console.log(child.__proto__ === Parent.prototype); // 输出 true
console.log(Object.keys(Parent.prototype)); // 输出 []

// 自定义原型对象
Parent.prototype = {
    constructor: Parent,
    name: "原型对象",
    desc: "函数原型对象的 constructor 应该指向自身函数,并且 constructor 不可访问"
};

// 检验原型对象一致性
console.log(child.__proto__ === Parent.prototype); // 输出 false
console.log(Object.keys(Parent.prototype)); // 输出 [name, desc, constructor]

// 重置 constructor 可枚举属性
Object.defineProperty(Parent.prototype, "constructor", {
    enumerable: false, // 不可枚举属性
    value: Parent
});

console.log(Object.keys(Parent.prototype)); // 输出 [name, desc]

// 创建一个没有原型对象的对象
Object.create(null); // {}
Object.create(null).__proto__; // undefined
Object.create(null).prototype; // undefined
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32