【发布时间】:2012-09-30 11:40:30
【问题描述】:
在尝试了解 javascript 构造函数时,我一直在查看 this question。
在我看来,我理解它是合理的,但具有讽刺意味的是,当我尝试运行类似的代码时,它根本不适合我。
这是我的代码
function Car(name) {
this.Name = name;
this.Year = 1999;
}
Car.prototype.Drive = function() {
document.write("My name is '" + this.Name + "' and my year is '" + this.Year + "'. <br />");
};
SuperCar = function () { };
SuperCar.prototype = new Car();
function SuperCar(name) {
Car.call(this, name);
}
var MyCar = new Car("mycar");
var MySuperCar = new SuperCar("my super car");
MyCar.Drive();
MySuperCar.Drive();
首先是这一行
SuperCar = function () { };
是它运行所必需的。如果我忽略它,我会在这一行出现错误“SuperCar 未定义”。
SuperCar.prototype = new Car();
我真的不明白为什么有必要将 SuperCar 声明为空函数。
其次,当我运行代码时,我会得到这个结果
My name is 'mycar' and my year is '1999'.
My name is 'undefined' and my year is '1999'.
显然,对于 MySuperCar,SuperCar(name) 函数从未被调用,但 Car() 被调用。
添加这一行没有帮助
SuperCar.prototype.constructor = SuperCar;
这个也没有
SuperCar.prototype.constructor = function(name) {
Car.call(this, name);
};
(我一直在 IE 9 和 Chrome 22 上的脚本标签内运行代码)
我应该如何正确定义采用名称参数的 SuperCar 构造函数?或者,换一种说法,我怎样才能让新的 SuperCar("my super car") 调用按我预期的方式运行(将名称设置为“my super car”)?
【问题讨论】:
-
Fiddle: jsfiddle.net/userdude/Gs4qu 一般来说,你可能会远离
document.write,我建议改为document.body.innerHTML = "blah blah blah<br>";,或者DOM方法。 -
如果我注释掉您要询问的函数变量,它也可以工作:jsfiddle.net/userdude/Gs4qu/1 正下方,您已经声明了
function SuperCar(name){...},并且提升将其置于范围的顶部。因此,除非有一段时间该函数不存在或者最初是一个变量函数或函数变量(谁能分辨出区别?),否则我不明白为什么会出现问题。我在这里也谈论 Chrome。
标签: javascript inheritance constructor prototypal-inheritance