我一直在阅读JavaScript中的原型链,并得出了两个稍微不同的定义。据说,JavaScript中的每个对象都有一个原型,而那个原型又有另一个原型。
顶部原型(Grand)也可能有原型,并且链可以继续。现在链子会停在最后一个物体上。https://en.wikipedia.org/wiki/Douglas_Crockford#Bibliography说,链在Object.prototype终止,MDN说 null是链终止的最后一个环节。
Javascript:每个对象的好部分都链接到一个原型对象,它可以从中继承属性。从对象文本创建的所有对象都链接到
Object.prototype,,是JavaScript标准的对象。每个对象都有到另一个称为原型的对象的内部链接。这个原型对象有自己的原型,依此类推,直到达到一个以null作为原型的对象。根据定义,null没有原型,并充当此原型链中的最后一个链接。
null和Object.prototype是同一回事?Object.prototype的对象。var x = { len: 4, breadth: 5}。JavaScript会自动创建它的原型x.prototype吗?原型链会有多长?x.prototype只会有一个原型,Object.prototype,制造三点链吗?发布于 2016-04-18 11:51:50
null,这意味着不能再往上走了。确保你知道,要上上下下,这是__proto__。这不是prototype。Object.prototype,Animal.prototype与x.__proto__不同。前者是函数对象(对象、动物),具有指向原型对象的prototype属性。x.__proto__是原型链向上跟踪的方式。向上和向上,它是x.__proto__.__proto__等等。请参阅JavaScript伪经典继承图以更多地理解它。Object.prototype指的是原型对象。引自MDN,null“表示有意缺少任何对象值,它是JavaScript的原始值之一。所以Object.prototype和null不是一回事。obj.__proto__最终引用Object.prototype引用的内容。如果它不是obj.__proto__,那么它就是obj.__proto__.__proto__。如果没有,只要向上,然后向上,它将到达Object.prototype引用的prototype对象。此时,当您上升一个级别时(通过添加一个.__proto__,则得到null。您可以在Google的开发者工具中试用:
X= {a: 1} > Object {a:1} x.__proto__ === Object.prototype > true x.__proto__.__proto__ > null Object.prototype.__proto__ > null发布于 2016-04-18 11:49:13
JavaScript中原型链的末端是什么?
零。语言上只有的权限是https://tc39.es/ecma262/#sec-properties-of-the-object-prototype-object。
不是从对象文本创建的对象,是否没有链接到
Object.prototype?
他们可能或者很多人不是,例如。
var x = Object.create(null)[[Prototype]]为null,而:
var y = {};拥有[[Prototype]] of Object.prototype。
假设我有一个对象
var x = { len: 4, breadth: 5}。JavaScript会自动创建它的原型x.prototype吗?
不是的。函数对象具有默认的原型对象。普通对象有一个默认的[[Prototype]] (即内部原型属性),即Object.prototype (除非按照上面的构造)。
原型链会有多长?
x.prototype只会有一个原型,Object.prototype,制造三点链吗?
两个值: Object.prototype和null。
JavaScript如何在内部创建自动原型?
不管它喜欢什么,语言规范并不定义实现,只定义行为。
发布于 2017-03-18 22:43:06
javascript中原型链的末尾是什么--
null还是Object.prototype?还是null和Object.prototype是同一回事?
null。在普通的JavaScript环境中,考虑以下代码:
var o = {};
console.log(o.i_am_a_property_that_does_not_exist);属性访问器操作(o.i_am_a_property_that_does_not_exist)最终将转到规范定义的OrdinaryGet抽象操作,其中O设置为上面的o对象,P设置为"i_am_a_property_that_does_not_exist"。这个手术是这样开始的:
让父母来吧?O.GetPrototypeOf。
如果父级为null,则返回未定义的。
c.返回?父母,[得到]。
对于上面的例子,[Get]操作在3.c中。最后递归地调用OrdinaryGet,直到我们的原型用完为止。正如我们所看到的,当我们到达null时,链就结束了。
此外,有一个不包含Object.prototype的原型链的对象是完全可能的(稍后我们会看到一些)。所以很明显,Object.prototype不可能是原型链的末尾。
不是从对象文本创建的对象,是否没有链接到
Object.prototype?
绝大多数将直接或间接地与Object.prototype联系在一起。考虑:
function Thing() {
}
var t = new Thing();t的原型是Thing.prototype引用的对象,Thing.prototype的原型是Object.prototype,因此t与Object.prototype (间接)相连。
但是,对象完全有可能不链接到Object.prototype。有一种方法:
var o = Object.create(null);Object.create允许我们使用我们在第一个参数中指定的原型(上面的null)创建一个对象。所以上面的o没有原型,它的[ prototype ]内部插槽(对象记住它们的原型)是null。
这是另一个:
function Thing() {
}
Thing.prototype = Object.create(null);
var t = new Thing();在这种情况下,尽管t有一个原型,但它的原型是空的;t根本没有链接到Object.prototype。
假设我有一个对象
var x = { len: 4, breadth: 5}。JavaScript会自动创建它的原型x.prototype吗?
对象的原型不是一个名为prototype的属性,所以JavaScript引擎不会创建x.prototype。对象的原型通过其[ prototype ]内部插槽链接,这不是直接可观察的,而是可以通过Object.getPrototypeOf检索的。(也有属性,但最好不要使用它,尤其是因为A)它是规范的一个可选部分,B)并非所有对象都继承自Object.prototype,这是定义__proto__的地方。)
prototype属性仅用于函数,以确定使用哪个对象作为通过带有该函数的new创建的新对象的[原型]。非函数对象没有它,如果有,它就不会比一个名为foo或bazinga的属性更特殊。
原型链会有多长?
x.prototype只会有一个原型Object.prototype做一个三点链吗?
您已经接近了,但是同样,prototype属性不是对象的原型,非函数对象通常不会有prototype属性。对于var x = { len: 4, breadth: 5},继承链是:
xx's [原型]Object.prototype的[原型],就是null因此,非常短;1、2或3取决于您是否要计数x和是否要计数null。
JavaScript如何在内部创建自动原型?
除了规范定义的那些(例如,Object.prototype等)之外,它没有。最接近的是,对于所有function函数,JavaScript引擎会自动创建一个对象,并将该对象分配给该函数的prototype属性,以防该函数被用作构造函数(通过new)。(它不使用箭头函数或生成器来实现这一点。)
https://stackoverflow.com/questions/36692927
复制相似问题