我们来对比一下两种把 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()
- javascript|穿戴设备将迎变革,OPPO又增新专利,能提升模式切换效率!
- |强劲送风,满足你对美感的挑剔—洛斐有范S桌面风扇
- 你甩不掉的伴侣——AEROPEXAS800初体验
- 趋势雷达|行业流行力——《新锐美妆种草看点》
- 社交平台cookie出卖了你——木马FFdroider欲窃取你的账户信息丨大东话安全
- 电子商务|广州蓝景分享 — 给刚入职前端\大佬\们的一些建议
- 开源软件|嵌入式开发:技巧和窍门——引导加载程序跳转到应用程序代码
- 三星|三星 S22 Ultra——硬件上的机皇,系统体验两极分化
- 天津航空——打造主题飞机 为智能大会插上“双翼”
- 支付宝|嵌入式开发:嵌入式基础——重启和重置的区别
