繁体   English   中英

Javascript简单的原型继承

[英]Javascript Simple Prototypal Inheritance

我在控制台里玩,试图了解原型继承。 我熟悉经典继承,但我从未在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";

请记住, foobar的原型。

原型成员仅在您实例化时才可用。 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.dogbar.cat它打印roveroliver分别

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

var a = function(){
}

a.prototype = {};

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

a = {};

a.\__proto__.foo = 'bar';

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM