【问题标题】: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 创建之前。