为什么foo.hasOwnProperty('__proto__')等于false ?
Why is foo.hasOwnProperty('__proto__') equal to false?
var foo = {
bar : 5
}
为什么foo.hasOwnProperty('__proto__')
等于false
?
它不能来自原型链上的任何对象,因为它是特定于这个对象的。
编辑:
一些答案说它在Object.prototype
上。
但我不明白这有什么意义。我的问题不是它在哪里,而是为什么它不在它应该在的地方。
例如:var a = new Foo();
var b = new Bar();
// Foo inherits from Bar
那么a.__proto__
不应该等于b.__proto__
吗?
因为它们都读取Object.prototype
?
事实上,__proto__
继承自Object.prototype
:
foo.hasOwnProperty('__proto__') // false
Object.prototype.hasOwnProperty('__proto__') // true
根据MDN的文章
__proto__
属性没有什么特别的。很简单访问器属性——由getter函数和在Object.prototype.
就像你说的,从直觉上看,由于__proto__
与每个对象本质上是相关的,它应该是一个单独的属性。
但它不是这样的。相反,Object.prototype.__proto__
有一个getter函数,它在不同的对象上调用时返回不同的结果。
如果运行
,也可以得到类似的结果Object.defineProperty(
Object.prototype,
'self',
{get: function(){return this}}
)
现在你可以在不同的对象上调用.self
,你会得到不同的结果。
还请注意,此行为并不仅限于__proto__
。例如,HTML元素的id
属性也不是自己的属性:
var el = document.createElement('div');
el.id = 'foo';
el.hasOwnProperty('id'); // false
Element.prototype.hasOwnProperty('id'); // true
(Webkit浏览器不遵循规范,el.hasOwnProperty('id')
是true
)
相关文章:
- 如果 a 为 false,则 if(a) === if(false)
- 如何在angularJS中编辑时,如果DB中的值为true,则设置复选框,如果值为false,则取消选中复选框
- 测试索引值是否等于某个数字的倍数
- 如何将localStorage值设置为false
- JavaScript-切换“;全部检查”;复选框true/false
- gulp Iconify任务抛出错误TypeError:Path必须是字符串.收到false
- 如何检查数组中的对象是否等于选项值
- ajax在输入等于null时进行检查
- 如何将Date字段设置为等于另一个Date+Int值,该值表示月份值
- 我怎么能让流星简单模式中的一个字段等于一个js变量,并且仍然让用户填写简单模式的其余部分
- dractor.js应为[]等于[“..”,“..”]
- 如何使用javascript将字段强制设置为false
- CORS:访问控制允许原点不等于提供的原点
- (false==false==true)怎么可能是真的
- 在if语句中,undefined等于false
- 链接双等于==返回false
- 如何使真实&&angularjs表达式中的false等于true
- 为什么!new Boolean(false)在JavaScript中等于false ?
- 我怎么能返回一个空对象同时空对象等于布尔值false在javascript
- 为什么foo.hasOwnProperty('__proto__')等于false ?