JS原型对象没有继承?

时间:2014-05-31 13:06:15

标签: javascript prototype prototypal-inheritance

我的问题是我在玩JS原型继承时遇到的一个奇怪的输出。

请看一下:

function Parent(){
}

Parent.prototype = {
  variable : 'a'
}; 


function Child(){
}

Child.prototype = new Parent();


child = new Child();

Parent.prototype =
{
  variable : 'c'
};


console.log(child.variable);  // output a
console.log(child.__proto__);  // [object Object] { variable: 'a'}

为什么孩子没有继承财产?

当然,如果我这样做的话:

function Parent(){
}

Parent.prototype.variable = 'a'; 


function Child(){
}

Child.prototype = new Parent();


child = new Child();

Parent.prototype.variable = 'c';

console.log(child.variable); //  "c"
console.log(child.__proto__); //  [object Object] { variable: "c"}

预期输出:" c"和

[object Object] {
  variable: "c"
}

有谁知道为什么对象'原型'在“原型”的正常属性的情况下,它不是继承的。是

3 个答案:

答案 0 :(得分:2)

  

为什么孩子没有继承财产?

重新分配和变异之间的区别

重新分配:

var org = {val:22};
var copy = org;
//re assigning org de references copy
//  before this line copy === org
//  but after this line it isn't
org = {val:44};
//what do you think the value of copy is
console.log(copy.val);//=22 re assigning org de references copy

不同诱变:

var org = {val:22};
var copy = org;
org.val=33;//mutating org
//mutating copy (copy.val=11) would affect org
//  because org and copy are still the same (copy === org)
console.log(copy.val);//=33 because mutated org

你不应该创建一个Parent实例来设置Child的原型(改为使用Object.create),并在你的注释中将Child的原型设置为Parent.prototype,你不能这样做因为一个Child是父母但父母不是孩子(例如:狗是动物,但动物不是狗,因为动物可能是蛇)。

有关构造函数和原型的更多信息,请访问:https://stackoverflow.com/a/16063711/1641941

答案 1 :(得分:1)

Child.prototype = new Parent(); 将构建一个新的Parent - 对象,其当前Parent.prototype 对象Child.prototype.__proto__

使用:Parent.prototype.variable = 'c';会更改对象属性variable, 由于它仍然是Child.prototype.__proto__的同一对象,因此该变量也将在Child上修改。

由于Parent.prototype = { variable: 'c' };会将Parent.prototype对象更改为完全新对象。但是旧原型的引用(Child.prototype.__proto__仍然是旧的,不会有任何修改。

答案 2 :(得分:1)

  

有谁知道为什么对象'原型'不是继承的......

为实例分配一个私有[[Prototype]],它是构建函数的公共原型,当它们被创建时。稍后将新对象分配给构造函数的原型不会更改已创建的实例的[[Prototype]],它们将继续引用原始对象。

所以当你第一次构建 child 时,它的[[Prototype]] Child.prototype ,它是 Parent 的一个实例,因此继承自创建时存在的 Parent.prototype

稍后分配新的 Parent.prototype 时,不会更改已创建的[[Prototype]]个实例,因此 Child.prototype 仍然继承自原始的 Parent.prototype ,因此 child 也是如此。

  

...'原型'的正常属性是?

因为它只是向现有对象添加了一个新属性,所以它不会将新对象分配给构造函数的 prototype 属性。