我在控制台里玩,试图了解原型继承。我熟悉经典继承,但我从未在JS工作中使用任何继承。
如果我有:
var foo = {
cat: "oliver"
}
var bar = Object.create(foo);
foo.prototype = {
dog: "rover"
}
当我这样做时:
dir(bar.dog)
或
dir(foo.dog)
我希望看到rover
,但它们都会以undefined
的形式返回。
我错过了什么?
提前致谢。
答案 0 :(得分:3)
你看到这一点是因为这一行:
foo.prototype = {
dog: "rover"
}
创建该对象后,无法更改对象的原型。
您可以做的是修改现有的原型:
foo.dog = "rover";
请注意foo
是bar
的原型。
答案 1 :(得分:2)
原型成员仅在实例化时才可用。 foo.cat
可用,因为它类似于"静态"}属性(来自具有此类代码支持的语言,例如PHP)。此外,在执行foo
Object.create
原型
var foo = function(){ };
foo.cat = "oliver";
var bar = Object.create(foo.prototype);
foo.prototype.dog = "rover";
console.log(bar.dog); // yields "rover", modifying the prototype of "foo" alter the members of "bar" instance
答案 2 :(得分:1)
这将是完成您所尝试的正确代码:
var foo = Object.create({dog:'rover'});
foo.cat = 'oliver';
var bar = Object.create(foo);
这种方式foo
继承自具有名为dog
的属性的对象,然后bar
继承自同一个对象,因为它继承自foo
现在,请与bar.dog
和bar.cat
核对,分别打印rover
和oliver
注意.prototype
仅用于访问或设置函数的原型对象,你在该代码中所做的是错误的,这是正确的:
var a = function(){
}
a.prototype = {};
以这样的方式访问对象的原型:
a = {};
a.\__proto__.foo = 'bar';
然而,这允许您获取或设置该原型对象的属性,但不能将其替换为另一个原型对象。