我们来对比一下两种把 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 无法实现 。
下面这段荒谬的代码试图站在「类」的角度使用 instanceof 来判断两个对象的关系:
我不明白 , 什么叫两个对象是否通过 [[Prototype
关联 。
指的是 a.prototype = Object.create( Foo.prototype ) 这个语句吗?
问题是命名都用 new 了 , 我为什么要判断是否通过 [[Prototype
关联呢?
脱裤子放屁 , 多此一举 。
// 用来判断 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) , 我们只需要一个可以用来判断的对象就行 , isPrototypeOf(..) 回答的问题是:在 a 的整条 [[Prototype
我不明白 , Foo 这个函数在上面代码里有出现过吗?内部函数和 a 有鸡毛关系?
链中是否出现过 Foo.prototype?
自信点 , 把甚至两个字去了 , 你真的不需要 Foo 。
function Foo() {
var b = {
var a = new Foo()
- 编程|芒果口袋携手阿里巴巴地推第一人王志坚又掀业内新浪潮——成就数字化行业新高度!
- 九江市疾控中心新冠肺炎疫情常态化防控相关防护指南——图书馆篇
- 软件|黑色基调 ——西数SN770评测
- 传统媒体|品牌出海:Facebook广告投放指南——优惠广告怎么创建?
- 通讯:血染的小白鞋——一位“猪湾事件”幸存者的控诉
- 惠普新一代轻薄本——星14青春版|惠普星14青春版开售:全新12代酷睿 仅4099元
- javascript|在B端和C端公司做公关,有什么区别?
- javascript|现在分布式、云智能时代,应用软件开发简直得JavaScript者得天下
- 携程|现在分布式、云智能时代,应用软件开发简直得JavaScript者得天下
- 云米|0—1999元手机性价比排名:OPPO K9 Pro上榜!