原型链浅析
程序员文章站
2024-03-13 10:53:33
...
原型链
prototype
属性和__proto__
属性
普通对象是没有prototype
属性的,只有隐藏属性__proto__
(但是建议不要使用__proto__
属性)。而函数对象则两者兼有。prototype
属性指向的是函数对象的原型对象,而__proto__
属性可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型,这也保证了实例能够访问在构造函数原型中定义的属性和方法。
prototype
属性和__proto__
属性关系
关系图解:
实例
var M = function (name) { this.name = name; }
var o3 = new M('o3')
进入Chrome控制台进行测试:
基于本例中o3是实例,M是构造函数。进行如下总结:
- 实例通过new一个构造函数生成的。
- 实例的
__proto__
指向的是原型对象。实例的构造函数的prototype
也是指向的原型对象。因此得出一个对象的隐式原型(即__proto__
)指向构造该对象的构造函数的原型的结论。 - 原型对象的
construor
指向的是构造函数。
原型链
简单理解就是原型组成的链,对象的__proto__
它的是原型,而原型也是一个对象,也有__proto__
属性,原型的__proto__
又是原型的原型,就这样可以一直通过__proto__
向上找,这就是原型链,原型链的尽头是null
。
类的prototype
属性和__proto__
属性
class是构造函数的语法糖,同时有prototype
属性和__proto__
属性,因此存在两条继承链。
(1)子类的__proto__
属性,表示构造函数的继承,总是指向父类。
(2)子类prototype
属性的__proto__
属性,表示方法的继承,总是指向父类的prototype
属性。
class A {
}
class B extends A {
}
console.log(B.__proto__ === A); // true
console.log(B.prototype.__proto__ === A.prototype); // true
Object.prototype
Object.prototype属性表示 Object 的原型对象。
Object.prototype 属性的属性特性:
特性名称 | 描述 | 默认值 |
---|---|---|
writable | 是否可修改属性的值;true:可修改属性的值;false:不可修改属性的值 | false |
enumerable | 是否可枚举属性;true:可枚举,可通过for/in语句枚举属性;false:不可枚举 | false |
configurable | 是否可修改属性的特性;true:可修改属性的特性(如把writable从false改为true);false:不可修改属性的特性 | false |