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


我们来对比一下两种把 Bar.prototype 关联到 Foo.prototype 的方法:
// ES6 之前需要抛弃默认的 Bar.prototypeBar.prototype = Object.create( Foo.prototype )// ES6 开始可以直接修改现有的 Bar.prototypeObject.setPrototypeOf( Bar.prototype Foo.prototype );
如果忽略掉 Object.create(..) 方法带来的轻微性能损失( 抛弃的对象要进行垃圾回收) , 它实际上比 ES6 及其之后的方法可读性更高并且更短 。
检查「类」关系假设对象 a , 如何寻找对象 a 委托的对象呢?在传统的面向类环境中 , 检查一个实例的继承祖先通常被称为内省(或者反射) 。
思考下面的代码:
function Foo() {    Foo.prototype.blah = ...var a = new Foo()
我们如何通过内省找出 a 的「祖先」(委托关联)呢?第一种方法是站在「类」的角度来判断:
a instanceof Foo // true
instanceof 操作符的左操作数是一个普通的对象 , 右操作数是一个函数 。 instanceof 回答的问题是:在 a 的整条 [[Prototype

链中是否有指向 Foo.prototype 的对象?
可惜 , 这个方法只能处理对象和函数之间的关系 。 如果你想判断两个对象之间是否通过 [[Prototype

链关联 , 只用 instanceof 无法实现 。


我不明白 , 什么叫两个对象是否通过 [[Prototype

关联 。
指的是 a.prototype = Object.create( Foo.prototype ) 这个语句吗?
问题是命名都用 new 了 , 我为什么要判断是否通过 [[Prototype

关联呢?
脱裤子放屁 , 多此一举 。
下面这段荒谬的代码试图站在「类」的角度使用 instanceof 来判断两个对象的关系:
// 用来判断 o1 是否关联到 o2 的辅助函数
function isRelatedTo(o1 o2) {
  function F() {
  F.prototype = o2
  return o1 instanceof F


var a = {c:1
var b = Object.create( a )

b // { ___proto___: { c: 1  
isRelatedTo(b a) // true

在 isRelatedTo(..) 内部我们声明了一个一次性函数 F , 把它的 prototype 重新赋值并指向对象 o2 , 然后判断 o1 是否是 F 的一个「实例」 。 显而易见 , o1 实际上并没有继承 F 也不由 F 构造 , 所以这种方法非常愚蠢并且容易造成误解 。 问题的关键在于思考的角度 , 强行在 JavaScript 中应用类的语义就会造成这种尴尬的局面 。

说真的 , 我不明白它这段代码是想要做什么 , 非常的莫名其妙 。
下面是第二种判断 [[Prototype

反射的方法 , 它更加简洁:
Foo.prototype.isPrototypeOf( a ) // true

我不明白 , Foo 这个函数在上面代码里有出现过吗?内部函数和 a 有鸡毛关系?
注意:在本例中 , 我们实际并不关心(甚至不需要 Foo) , 我们只需要一个可以用来判断的对象就行 , isPrototypeOf(..) 回答的问题是:在 a 的整条 [[Prototype

链中是否出现过 Foo.prototype?

自信点 , 把甚至两个字去了 , 你真的不需要 Foo 。

function Foo() {


var b = {
var a = new Foo()