我正在控制台里尝试理解原型继承。我熟悉经典继承,但在我的JS工作中从未使用过任何继承。
如果我有:
var foo = {
cat: "oliver"
}
var bar = Object.create(foo);
foo.prototype = {
dog: "rover"
}
当我执行以下操作时:
dir(bar.dog)
或者
dir(foo.dog)
我希望看到
rover
,但它们都返回为undefined
。我错过了什么?
提前致谢。
我正在控制台里尝试理解原型继承。我熟悉经典继承,但在我的JS工作中从未使用过任何继承。
如果我有:
var foo = {
cat: "oliver"
}
var bar = Object.create(foo);
foo.prototype = {
dog: "rover"
}
dir(bar.dog)
或者
dir(foo.dog)
rover
,但它们都返回为undefined
。您看到这个是因为这一行:
foo.prototype = {
dog: "rover"
}
foo.dog = "rover";
foo
是 bar
的原型。foo.cat
是可用的(来自具有此类代码支持的语言,例如PHP)。此外,在执行Object.create
时,应从foo
原型继承。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
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';
然而,这允许您获取或设置该原型对象的属性,但不能将其替换为其他对象。