3

我在控制台中玩耍,试图理解原型继承。我熟悉经典继承,但我从未在我的 JS 工作中使用过任何继承。

如果我有:

var foo = {
    cat: "oliver"
}

var bar = Object.create(foo);

foo.prototype = {
    dog: "rover"
}

当我做:

dir(bar.dog)

或者

dir(foo.dog)

我希望看到rover,但他们都回来了undefined

我错过了什么?

提前致谢。

4

3 回答 3

3

你看到这个是因为这条线:

foo.prototype = {
    dog: "rover"
}

创建对象后,您无法更改对象的原型。

你可以做的是像这样修改现有的原型:

foo.dog = "rover";

记住那foo是 的原型bar

于 2013-10-12T21:50:22.677 回答
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
于 2013-10-12T21:46:57.173 回答
1

这将是完成您正在尝试的正确代码:

var foo = Object.create({dog:'rover'});

foo.cat = 'oliver';

var bar = Object.create(foo);

这种方式foo从一个具有名为 的属性的对象继承dog,然后bar从同一个对象继承,因为它继承自foo

现在,检查bar.dog并分别bar.cat打印roveroliver

请注意,.prototype仅适用于访问或设置函数的原型对象,您在该代码中所做的事情是错误的,这是正确的:

var a = function(){
}

a.prototype = {};

要访问对象的原型,您可以这样做:

a = {};

a.\__proto__.foo = 'bar';

但是,这允许您获取或设置该原型对象的属性,但不能将其替换为不同的对象。

于 2013-10-12T23:01:58.520 回答