【发布时间】:2014-01-16 11:36:54
【问题描述】:
我很难理解 Javascript 中的构造函数调用模式。
我有一个基础对象Mammal(使用术语class会不正确吗?)和一个继承对象Cat。在下面的代码中,对象Cat 正确地继承自 Mammal 对象。
/*
Mammal base Object
*/
var Mammal = function(name) {
this.name = name;
}
Mammal.prototype.get_name = function() {
return this.name;
}
Mammal.prototype.says = function () {
return this.saying || '';
}
/*
Cat object
*/
var Cat = function (name) {
this.saying = "Meow";
this.name = name;
}
Cat.prototype.purr = function (number) {
var i =0, s='';
for ( i=0; i<number; i++)
if (s)
s +='-';
s+='r';
return s;
}
Cat.prototype = new Mammal();
console.log("Pseudo classical inheritance approach");
var mammal = new Mammal(" I am a mammal");
console.log("Who are you ? " + mammal.get_name());
console.log("What are you saying? " + mammal.says());
var cat = new Cat('I am a cat');
console.log("Who are you ? " + cat.get_name());
console.log("What are you saying? " + cat.says());
我不喜欢这种模式的基础对象的构造函数是如何使用的。对象Cat 没有正确重用基类Mammal 的构造函数。我希望有更大的灵活性。每次创建Cat 对象时,都会调用Mammal 对象的构造函数,不带任何参数。我想使用类似于Java中“super”关键字的机制,这样当Cat的构造函数以name为参数调用时,Mammal的构造函数也以name为参数调用.
我尝试如下实现Cat 构造函数:
var Cat = function (name) {
this.saying = "Meow";
// Super (name);
this.prototype = new Mammal(name);
}
这没有按预期工作。 this.prototype 未定义。为什么?为什么这种方法是完全错误的? this 是否指向新的 Cat 对象?
我知道,在 javaScript 中实现继承有不同的方法,但我想知道是否有一种方法可以像在 Java 中那样实现超级机制。
谢谢。 :D
【问题讨论】:
标签: javascript inheritance constructor prototype