你不知道的JS-读书笔记(五)--原型[Prototype]

[[Prototype]] 链

function Foo () {
  this.tmp = 'b'
}
var a = new Foo()
Object.getPrototypeOf(a) === Foo.prototype // true
a.tmp // 'b'

调用 new Foo() 时会创建 a, 其中的一步就是给 a 一个内部的 [[Prototype]] 链接, 关联到 Foo.prototype 指向的那个对象。

constructor 属性

// 接上代码
Foo.prototype.constructor === Foo // true
a.constructor === Foo // true

constructor 属性常被误解为指向构造函数,即这里的 Foo,实际上 a 本身并没有 constructor 属性,而是从 [[Prototype]] 链中找到该属性并返回的,验证如下

function Foo () {
  // ...
}
Foo.prototype = {}
var a1 = new Foo()
a1.constructor === Foo // false
a1.constructor === Object // true

a1 并没有 constructor 属性, 所以它会委托 [[Prototype]] 链上的 Foo.prototype。 但是这个对象也没有 constructor 属性(不过默认的 Foo.prototype 对象有这个属性! ), 所以它会继续委托, 这次会委托给委托链顶端的 Object.prototype。 这个对象有 constructor 属性, 指向内置的 Object(..) 函数。

小结

原型链的顶端是 Object.prototype, 如果在原型链中找不到指定的属性就会停止。 toString()valueOf() 和其他一些通用的功能都存在于 Object.prototype 对象上, 因此语言中所有的对象(除去通过 Object.create(null) 声明的对象)都可以使用它们。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值