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