看看以下代码:
function Primate() {
this.prototype = Object;
this.prototype.hairy = true;
}
function Human() {
this.prototype = Primate;
}
new Human();
当您检查new Human()
时,没有hairy
成员。我希望有一个。还有另一种我想从Primate
继承的方式吗?涉及Object.create()
的东西(在我的场景中可以使用ECMAScript5)?
答案 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();