2013-10-12 159 views
3

我在控制台中玩耍,试图了解原型继承。我熟悉古典继承,但我从未在JS工作中使用任何继承。Javascript简单原型继承

如果我有:

var foo = { 
    cat: "oliver" 
} 

var bar = Object.create(foo); 

foo.prototype = { 
    dog: "rover" 
} 

当我这样做:

dir(bar.dog) 

dir(foo.dog) 

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

我错过了什么?

在此先感谢。

+0

我想我困惑的地方是:在实例化对象(函数)和对象上的原型属性。创建是否能够将对象字面量用作原型?或者这种模式只适用于构造函数? –

+0

您无法在对象实例上设置原型(如foo对象字面值),并希望它像在函数上设置原型那样工作。你所做的只是在foo上添加一个名为prototype的属性,但JS运行时不会用它来查找。大卫给出了最正确的答案。有关原型的更多信息:http://stackoverflow.com/a/16063711/1641941 – HMR

回答

1

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

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

foo.cat = 'oliver'; 

var bar = Object.create(foo); 

这样从一个属性的对象称为dog,然后从同一个对象bar继承,因为它从foo

继承 foo继承

现在,请与bar.dogbar.cat它打印roveroliver分别

通知,.prototype只能访问或设置的功能原型对象,你在代码做的事情是错误的,这是正确的:

var a = function(){ 
} 

a.prototype = {}; 

访问一个对象,你不喜欢它的原型这个:

a = {}; 

a.\__proto__.foo = 'bar'; 

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

2

原型成员仅在实例化时才可用。 foo.cat可用,因为它就像“静态”属性(来自具有这种代码支持的语言,例如PHP)。此外,你应该做你的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 
3

时,您所看到的,因为这条线的这起foo原型继承:

foo.prototype = { 
    dog: "rover" 
} 

您创建一个对象后,您不能更改对象的原型。

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

foo.dog = "rover"; 

记住foobar原型。