【问题标题】:Inheriting properties from prototype从原型继承属性
【发布时间】:2016-02-15 08:33:53
【问题描述】:
function classA(){}; 

classA.prototype.age =25;

var obj = new classA();

console.log(obj.age)  //returns 25

现在,当我这样做时:

classA.prototype = {};

为什么obj.age 仍然返回25

【问题讨论】:

    标签: javascript object constructor prototype


    【解决方案1】:

    发生这种情况是因为您将classA.prototype 指向了一个新对象,但您没有更改obj.prototype 指向的对象。

    正在发生的事情是:

    classA.prototype ------> A
    // create object with new classA()
    // now its prototype also points to A
    obj.prototype    ------> A    // points to the same prototype
    

    现在你重新签名classA的原型

    classA.prototype ------> B
    

    obj的原型仍然指向A(从未改变)

    obj.prototype    ------> A
    

    所以您所做的只是更改classA 的原型引用obj 的原型引用已经建立之后。

    如果您想让obj 看到原型上的更改,然后更改它引用的对象(上例中的A)而不是引用本身

    示例代码:

    function classA(){}; 
    
    classA.prototype.age =25;
    
    var obj = new classA();
    
    console.log(obj.age)   // 25
    
    // change the object itself, not the reference
    delete classA.prototype.age;
    
    console.log(obj.age); // undefined

    【讨论】:

    • 还有什么办法可以改变对象的原型吗?
    【解决方案2】:

    在创建对象后重新分配您的prototype 对先前创建的对象没有影响,它仍然具有创建时的旧prototype。新的prototye 只会影响新创建的对象

    【讨论】:

      【解决方案3】:

      如果您的代码按以下顺序排列:

      function classA(){}; 
      
      classA.prototype.age = 25;
      classA.prototype = {};
      
      var obj = new classA();
      console.log(obj.age)  // returns undefined
      

      结果确实是你的例外行为。这取决于您何时设置 classA 函数的原型。这将通过以下代码 sn-p 来演示:

      function classA(){}; 
      
      classA.prototype.age = 25;
      
      var obj1 = new classA();
      
      classA.prototype = {};
      
      var obj2 = new classA();
      
      console.log(obj1.age)  // returns 25
      console.log(obj2.age)  // returns undefined
      

      因此,object 仅受函数的 prototype 更改的影响,前提是这种情况发生在 object's 创建之前。

      【讨论】:

        猜你喜欢
        • 2023-03-16
        • 2015-01-17
        • 2013-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-18
        • 1970-01-01
        相关资源
        最近更新 更多