我一直在阅读JavaScript中的原型链,并得出两个略有不同的定义。据说JavaScript中的每个对象都有一个原型,而原型又有另一个原型。顶级原型(Grand)也可能有原型,链条可以继续。现在,链条将停在最后一个对象上。 JavaScript好的部分表示链终止于Object.prototype
而MDN表示null
是链终止的最后一个链接。
Javascript:好的部分
每个对象都链接到一个原型对象,它可以从中继承属性。 从对象文字创建的所有对象都链接到
Object.prototype
,这是JavaScript标准的对象。
MDN
每个对象都有一个内部链接指向另一个称为其原型的对象。该原型对象具有自己的原型,依此类推,直到到达一个以null为原型的对象。根据定义,null没有原型,并且充当原型链中的最终链接。
问题:
null
和Object.prototype
是同一件事吗? Object.prototype
? var x = { len: 4, breadth: 5}
。 JavaScript会自动创建原型x.prototype
吗?原型链需要多长时间? x.prototype
只有一个原型Object.prototype
制作一个3点链?
答案 0 :(得分:2)
javascript中原型链的结束是什么
空。该语言的唯一权限是ECMA-262。
非对象文字创建的对象是否未链接到Object.prototype
他们可能或许多不是,例如
var x = Object.create(null)
的[[Prototype]]
为null,而:
var y = {};
有一个[[Prototype]]
的Object.prototype。
假设我有一个对象var x = {len:4,widthth:5}。 javascript会自动创建它的proptotype x.prototype。
没有。函数对象具有默认的原型对象。普通对象具有默认的[[Prototype]]
(即内部原型属性),即 Object.prototype (除非按上述方式构造)。
原型链需要多长时间? x.prototype只有一个原型Object.prototype构成一个3点链吗?
两个值: Object.prototype 和 null 。
javascript如何在内部创建自动原型?
然而它喜欢,语言规范不定义实现,只定义行为。
答案 1 :(得分:1)
就像,如果纽约有一个信封和内部,它说科罗拉多州,科罗拉多州有一个信封,内部,它说旧金山,旧金山有一个信封,内部,它说“没有”。那么旧金山的链条结束,还是“无”链的末端?这可能取决于你如何看待它。但有一件事是肯定的:它为了继承目的(原型继承)指向链上方,直到达到null
,这意味着无法进一步发展。并确保你知道,为了上升和上升链,它是__proto__
。它不是prototype
。
Object.prototype
,Animal.prototype
与x.__proto__
不同。前者是具有指向原型对象的prototype
属性的函数对象(Object,Animal)。 x.__proto__
是原型链如何向上追随的原因。要上升,它是x.__proto__.__proto__
,依此类推。请参阅JavaScript's Pseudo Classical Inheritance diagram以了解更多信息。
Object.prototype
指的是原型对象。 Quoted from MDN,null
“表示故意缺少任何对象值。它是JavaScript的原始值之一。”因此Object.prototype
和null
不是一回事。
所有JavaScript对象都会obj.__proto__
最终引用Object.prototype
所指的内容。如果不是obj.__proto__
,那么它是obj.__proto__.__proto__
。如果没有,只需向上,向上,它将到达Object.prototype
所指的原型对象。此时,当您上升一级时(通过添加.__proto__
,您就会获得null
。您可以在Google Chrome开发人员的工具中尝试:
x = { a : 1 }
> Object {a: 1}
x.__proto__ === Object.prototype
> true
x.__proto__.__proto__
> null
Object.prototype.__proto__
> null
答案 2 :(得分:0)
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"
。那个操作就像这样开始:
如果 desc 未定义,则
一个。让父母成为? 0 [GetPrototypeOf]。
湾如果父 null ,请返回 undefined 。
℃。回来? 父。[[Get]]( P , Receiver )。
...
对于我上面的例子,那个[[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
有一个原型,但它的原型的原型是null; t
根本未与Object.prototype
相关联。
说我有一个对象
var x = { len: 4, breadth: 5}
。 JavaScript会自动创建原型x.prototype
。
对象的原型不是名为prototype
的属性,所以不,JavaScript引擎不会创建x.prototype
。对象的原型通过其[[Prototype]]内部插槽链接,该插槽不能直接观察,但可以通过Object.getPrototypeOf
检索。 (如果对象派生自Object.prototype
,那么仅在[理论上]浏览器上,您可以使用Object.prototype
中的Annex B [browser-only] __proto__
property来访问它。但并非所有对象都具有该属性,因为...并非所有对象都继承自Object.prototype
!)
prototype
属性仅用于函数,以确定使用该函数通过new
创建的新对象的[[Prototype]]对象。非功能对象没有它,如果有,它就不会比名为foo
或bazinga
的属性更特殊。
原型链需要多长时间?
x.prototype
只有一个原型Object.prototype
制作一个3点链吗?
你很接近,但prototype
属性不是对象的原型,非功能对象通常不具有prototype
属性。对于var x = { len: 4, breadth: 5}
,继承链将是:
x
x
的[[原型]](Object.prototype
)Object.prototype
的[[原型]],即null
非常短暂; 1,2或3取决于您是否要计算x
以及是否要计算null
。
JavaScript如何在内部创建自动原型?
除了规范定义的内容之外,它不会(例如,Object.prototype
等)。最接近的是,对于所有function
函数,JavaScript引擎会自动创建一个对象并将该对象分配给函数的prototype
属性,以防万一该函数被用作构造函数(通过new
)。 (箭头函数或生成器不会这样做。)