Foo.prototype.isPrototypeOf( a ) // true
Foo.prototype.isPrototypeOf( b ) // false
加一段代码不行吗?距离说明更清楚 。
同样的问题 , 同样的答案 , 但是在第二中方法中并不需要间接引用函数 Foo , 它的 prototype 属性会自动被访问 。
我们只需要两个对象就可以判断它们之间的关系 , 举例来说:
我不明白他这句话是什么意思 。
没有例子的说明 , 显得如此的混乱 。
// 非常简单 , b 是否出现在 c 的 [[Prototype
链中?
b.isPrototypeOf( c )
注意:这个方法并不需要使用函数 , 它直接使用 b 和 c 之间的对象来引用来判断它们的关系 。 换句话说 , 语言内置的 isPrototypeOf(..) 函数就是我们的 isRealtedTo(..) 函数 。
我们也可以直接获取一个对象的 [[Prototype
以上所有莫名奇妙的解释和代码就为了解释 isPrototype 方法可以用来判断原型链上是否与另一个对象相关 。
这段写的不怎么样 。
链 。 在 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 中 。
都不是标准了 , 就别用了吧 。
此外 , .proto 看起来很像一个属性 , 但是实际上更像一个 getter/setter 。
我以前一直不明白 , 为什么原型链似乎是无限互相引用的 , 现在我明白了 , 压根就没有复制 , 而是委托 。
JavaScript 的继承机制是委托 。 !!!
甚至连继承这个词语都不准确 。
.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 ) 结果相同 。
.proto 是可设置属性 , 之前的代码中使用 ES6 的 Object.setPrototypeOf(..) 进行设置 。 通常来说 , 你不需要修改已有对象的 [[Prototype
a.proto 就是调用 调用 get 函数 , 即 a.proto()
。
一些框架会使用非常复杂和高端的技术来实现「子类」机制 , 但是通常来说 , 我们不推荐这种用法 , 因为这会极大地增加了代码的阅读难度和维护难度 。
Object.setPrototypeOf(a b) 将 b 设置为 a 的原型 。
- 编程|芒果口袋携手阿里巴巴地推第一人王志坚又掀业内新浪潮——成就数字化行业新高度!
- 九江市疾控中心新冠肺炎疫情常态化防控相关防护指南——图书馆篇
- 软件|黑色基调 ——西数SN770评测
- 传统媒体|品牌出海:Facebook广告投放指南——优惠广告怎么创建?
- 通讯:血染的小白鞋——一位“猪湾事件”幸存者的控诉
- 惠普新一代轻薄本——星14青春版|惠普星14青春版开售:全新12代酷睿 仅4099元
- javascript|在B端和C端公司做公关,有什么区别?
- javascript|现在分布式、云智能时代,应用软件开发简直得JavaScript者得天下
- 携程|现在分布式、云智能时代,应用软件开发简直得JavaScript者得天下
- 云米|0—1999元手机性价比排名:OPPO K9 Pro上榜!