为什么可以检索原型,但在JavaScript中未定义_proto__)?
现在我正在学习JavaScript为什么可以检索原型,但在JavaScript中未定义_proto__)?,javascript,google-chrome,prototype,v8,Javascript,Google Chrome,Prototype,V8,现在我正在学习JavaScriptprototype和\uuuuuuuuuuuuuuuuuuu,并找到几个有用的链接 我可以在Chrome下的以下代码中获取对象f的\uu proto\uu的值 var Foo = function() {} var f = new Foo(); f.__proto__ > Foo {} 但是,在将Foo.prototype.\uuuu proto\uu设置为null后,\uuuu proto\uu的值为未定义 var Foo = function(
prototype
和\uuuuuuuuuuuuuuuuuuu
,并找到几个有用的链接
我可以在Chrome下的以下代码中获取对象f
的\uu proto\uu
的值
var Foo = function() {}
var f = new Foo();
f.__proto__
> Foo {}
但是,在将Foo.prototype.\uuuu proto\uu
设置为null
后,\uuuu proto\uu
的值为未定义
var Foo = function() {}
Foo.prototype = {name: 'cat', age: 10};
Foo.prototype.__proto__ = null;
var f = new Foo();
f.__proto__
> undefined
但是我可以得到f.name
的值,即cat
。我的理解是,由于值f.name
可以检索,因此对象f
的\uuu proto\uuu
应该指向Foo.prototype
。为什么f.\uuuuu proto\uuuuu
的值是未定义的?
是JavaScript的一个内部特殊属性。你不应该使用
从
虽然Object.prototype.proto目前在大多数浏览器中都受支持,但它的存在和确切行为仅在ECMAScript 6规范中作为一项传统功能进行了标准化,以确保与web浏览器的兼容性。为了获得更好的支持,建议只使用Object.getPrototypeOf()来代替
,\uuu protou\uu
是从对象继承的访问器属性
由于实例f
的原型链植根于null
,而不是Object.prototype
,因此f
对象不会继承Object.prototype
的任何属性,包括Object.prototype.\uu proto\uu
对象仍然在内部知道它的原型(通过[[prototype]]内部插槽),但它不会继承用于获取此值的\uuuuuuuuuu
访问器属性。不过,您仍然可以通过Object.getPrototypeOf(f)
访问它
另见关于铬问题的决议:
这是工作的规定。ES6是在Object.prototype上定义的getter。对于原型链中没有的对象,它是不可访问的(就像hasOwnProperty不可访问一样)。您需要改用Object.getPrototypeOf
\uuuuu proto\uuuuu
-至少访问-在ECMA第6版中,并且以这种方式在Chrome中受支持,请参阅。无论如何,这个“答案”并没有解决所提出的问题。对…使用注释。。注释。它确实回答了“为什么f.\uuuuu-proto\uuuuu
的值是未定义的”\uuuuu-proto\uuuu
既不是内部的,也不是特殊的。这个答案没有回答这个问题;这个答案回答了“我应该使用\uuuuu proto\uuuuuuu
?”这个问题,这里没有问到这个问题。这也许可以作为一个评论。如果我在Biology.SE上问,“是什么化学成分使茄属植物如此有毒?”那么它并没有回答我的问题,而是告诉我,“茄属植物通常具有致命的毒性;你不应该吃它们。”我认为这实际上是一个体面的问题,即使行为(调查时)恰好是特定于浏览器的。询问了一个非常具体的案例/背景,这似乎与面值预期背道而驰<代码>\uuuu proto\uuuu
在Chrome和Firefox(以及WebKit?)中长期受支持,并在ES6中标准化。由于这现在是半事实行为(以及即将支持的行为),并且讨论了具体的上下文,“不应该使用”的“答案”并不是真正的答案,即使这样的陈述可能是一个很好的总结。我为这种行为打开了一个bug:我在7月份错误地回答了这个问题。我已经更正了我的答案。@apsillers,为什么最新的问题可以复制为我的问题,依我看,我的问题比复制的早。如果我遗漏了什么,请纠正我