原型链浅析

原型链

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原型链

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值