javascript中原型链的结束是什么 - null或Object.prototype?

时间:2016-04-18 11:39:14

标签: javascript oop object prototype

我一直在阅读JavaScript中的原型链,并得出两个略有不同的定义。据说JavaScript中的每个对象都有一个原型,而原型又有另一个原型。顶级原型(Grand)也可能有原型,链条可以继续。现在,链条将停在最后一个对象上。 JavaScript好的部分表示链终止于Object.prototypeMDN表示null是链终止的最后一个链接。

  

Javascript:好的部分

     

每个对象都链接到一个原型对象,它可以从中继承属性。 从对象文字创建的所有对象都链接到Object.prototype ,这是JavaScript标准的对象。

  

MDN

     

每个对象都有一个内部链接指向另一个称为其原型的对象。该原型对象具有自己的原型,依此类推,直到到达一个以null为原型的对象。根据定义,null没有原型,并且充当原型链中的最终链接

问题:

  • javascript中原型链的结束是什么 - null或Object.prototype?或nullObject.prototype是同一件事吗?
  • 不是从对象文字创建的对象是否未链接到Object.prototype
  • 说我有一个对象var x = { len: 4, breadth: 5}。 JavaScript会自动创建原型x.prototype吗?原型链需要多长时间? x.prototype只有一个原型Object.prototype制作一个3点链?
    • JavaScript如何在内部创建自动原型?

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)

  1. 就像,如果纽约有一个信封和内部,它说科罗拉多州,科罗拉多州有一个信封,内部,它说旧金山,旧金山有一个信封,内部,它说“没有”。那么旧金山的链条结束,还是“无”链的末端?这可能取决于你如何看待它。但有一件事是肯定的:它为了继承目的(原型继承)指向链上方,直到达到null,这意味着无法进一步发展。并确保你知道,为了上升和上升链,它是__proto__。它不是prototype

  2. Object.prototypeAnimal.prototypex.__proto__不同。前者是具有指向原型对象的prototype属性的函数对象(Object,Animal)。 x.__proto__是原型链如何向上追随的原因。要上升,它是x.__proto__.__proto__,依此类推。请参阅JavaScript's Pseudo Classical Inheritance diagram以了解更多信息。

  3. Object.prototype指的是原型对象。 Quoted from MDNnull“表示故意缺少任何对象值。它是JavaScript的原始值之一。”因此Object.prototypenull不是一回事。

  4. 所有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中原型链的结束是什么 - nullObject.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"。那个操作就像这样开始:

  1. 断言:IsPropertyKey( P )为真。
  2. desc 成为? 0 [GetOwnProperty]。
  3. 如果 desc 未定义,则

    一个。让父母成为? 0 [GetPrototypeOf]。

    湾如果 null ,请返回 undefined

    ℃。回来? 。[[Get]]( P Receiver )。

  4. ...

  5. 对于我上面的例子,那个[[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。因此tObject.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]]对象。非功能对象没有它,如果有,它就不会比名为foobazinga的属性更特殊。

      

    原型链需要多长时间? 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)。 (箭头函数或生成器不会这样做。)