原型链浅析

原型链

prototype属性和__proto__属性

普通对象是没有prototype属性的,只有隐藏属性__proto__(但是建议不要使用__proto__属性)。而函数对象则两者兼有。prototype属性指向的是函数对象的原型对象,而__proto__属性可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型,这也保证了实例能够访问在构造函数原型中定义的属性和方法。

prototype属性和__proto__属性关系

关系图解:

image

实例

var M = function (name) { this.name = name; }
var o3 = new M('o3')

进入Chrome控制台进行测试:

image

基于本例中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

参考:详谈JavaScript原型链

猜你喜欢

转载自blog.csdn.net/r122555/article/details/80684537
今日推荐