javascript|[[Prototype]] ——原型链两万字全面解析「建议收藏」(11)


Foo.prototype.isPrototypeOf( a ) // true
Foo.prototype.isPrototypeOf( b ) // false
加一段代码不行吗?距离说明更清楚 。
同样的问题 , 同样的答案 , 但是在第二中方法中并不需要间接引用函数 Foo , 它的 prototype 属性会自动被访问 。


我不明白他这句话是什么意思 。
没有例子的说明 , 显得如此的混乱 。
我们只需要两个对象就可以判断它们之间的关系 , 举例来说:
// 非常简单 , b 是否出现在 c 的 [[Prototype

 链中?
b.isPrototypeOf( c )

注意:这个方法并不需要使用函数 , 它直接使用 b 和 c 之间的对象来引用来判断它们的关系 。 换句话说 , 语言内置的 isPrototypeOf(..) 函数就是我们的 isRealtedTo(..) 函数 。

以上所有莫名奇妙的解释和代码就为了解释 isPrototype 方法可以用来判断原型链上是否与另一个对象相关 。
这段写的不怎么样 。
我们也可以直接获取一个对象的 [[Prototype

链 。 在 ES5 中 , 标准的方法是:
Object.getPrototypeOf( a )
可以验证一下 , 这个对象引用是否和我们想的一样:
function Foo() {
  this.a= 100


var a = new Foo()
Object.getPrototypeOf( a ) === Foo.prototype // true

绝大多数浏览器也支持一种非标准的方法来访问内部 [[Prototype

属性:
a.__proto__ === Foo.prototype // true
这个奇怪的 .proto 属性「神奇地」引用了内部的 [[Prototype

对象 , 如果你想查找原型链的话 , 这个方法非常有用 。

都不是标准了 , 就别用了吧 。
和我们之间说过的 .constructor 一样 , .proto 实际上并不存在于你正在使用的对象中 。 实际上 , 它和其他的常用函数一样 , 存在于内置的 Object.prototype 中 。

我以前一直不明白 , 为什么原型链似乎是无限互相引用的 , 现在我明白了 , 压根就没有复制 , 而是委托 。
JavaScript 的继承机制是委托 。 !!!
甚至连继承这个词语都不准确 。
此外 , .proto 看起来很像一个属性 , 但是实际上更像一个 getter/setter 。
.proto 的实现大致上是这样的 。
Object.defineProperty( Object.prototype '__proto__' {
  get:function() {
    return Object.getPrototypeOf( this )
  
  set: function(o) {
    Object.setPrototypeOf( this o )
    return o
  )

因此 , 访问 a.proto 时 , 实际上是调用了 a.proto() 。 虽然 getter 函数存在于 Object.prototype 对象中 , 但是它的 this 指向对象 a , 所以和 Object.getPrototypeOf( a ) 结果相同 。

a.proto 就是调用 调用 get 函数 , 即 a.proto()
.proto 是可设置属性 , 之前的代码中使用 ES6 的 Object.setPrototypeOf(..) 进行设置 。 通常来说 , 你不需要修改已有对象的 [[Prototype



Object.setPrototypeOf(a b) 将 b 设置为 a 的原型 。
一些框架会使用非常复杂和高端的技术来实现「子类」机制 , 但是通常来说 , 我们不推荐这种用法 , 因为这会极大地增加了代码的阅读难度和维护难度 。