我的问题是我在玩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" }
有谁知道为什么对象'原型'在“原型”的正常属性的情况下,它不是继承的。是
答案 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 属性。