JavaScript继承:什么时候我的派生成员?

时间:2012-01-30 18:27:33

标签: javascript inheritance prototypal-inheritance

看看以下代码:

function Primate() {
    this.prototype = Object;
    this.prototype.hairy = true;
}

function Human() {
    this.prototype = Primate;
}

new Human();

当您检查new Human()时,没有hairy成员。我希望有一个。还有另一种我想从Primate继承的方式吗?涉及Object.create()的东西(在我的场景中可以使用ECMAScript5)?

1 个答案:

答案 0 :(得分:4)

在编写代码时,使用new Human()创建的对象将具有名为prototype的属性,其值是对Primate函数的引用。这显然不是你想要的(并不是特别特别)。

一些事情:

  • 您通常希望修改要用作构造函数的函数prototype(使用new运算符)。换句话说,您要在prototype上设置Human(而不是Human实例)。

  • 您分配给prototype的值应为所需类型的实例(或者,如果不需要初始化工作,则为所需类型的prototype ),而不是对其构造函数的引用。

  • 永远不必将Object(或Object个实例)明确分配给函数prototype。这是隐含的。

你可能想要更像这样的东西:

function Primate() {
    this.hairy = true; 
}

function Human() {}
Human.prototype = new Primate();
Human.prototype.constructor = Human;

var h = new Human(); 

Human引用的h有一个名为hairy的属性,其值为true。

在上一个示例中,hairy仅在调用Primate时分配了其值,这就是必须为Human.prototype分配Primate实例的原因。这可以改为编写,以便不需要这样的初始化。

示例:

function Primate() {}
Primate.prototype.hairy = true;

function Human() {}
Human.prototype = Primate.prototype;
Human.prototype.constructor = Human;

var h = new Human();