【发布时间】:2015-08-05 08:41:08
【问题描述】:
已经有很多关于 JavaScript 中原型继承的线程,但是由于懒惰,这不是一个副本。我从字面上阅读了所有这些,并且发现了几乎与我找到答案一样多的不同句法方法,所以看来我不是唯一一个对这个主题感到困惑的人!
具体说明:
我目前的做法是这样的。
var Person = function(name) {
this.name = name;
this.greeting = function() {
alert("Greetings, I am " + name);
}
}
var bob = new Person("bob");
bob.greeting();
var Woman = function(name) {
Person.call(this, name);
this.gender = "female";
}
Woman.prototype = Object.create(Person.prototype);
var brenda = new Woman("brenda");
brenda.greeting();
Person.prototype.eats = true;
alert(brenda.eats);
测试了代码后,我发现它运行良好——据我所知——但有人告诉我这不是最好的方法,我应该像这样定义构造函数:
Woman.prototype.constructor = Woman;
并且不要在我的实际构造方法中使用 Person.call 方法。有两件事,被告知我看不到使用第二种方法传递参数的简单方法,还有,为什么?我正在做的似乎工作正常。
我错过了什么吗?
在某些情况下,我正在做的事情会产生不可预知的错误吗?
谁能给出一个明确的“正确”方法及其原因?
【问题讨论】:
-
prototype.call?你的意思是Person.call? -
我认为......我在这里可能错了,调用方法属于 Object.prototype 并且被继承。所以 Person.call 是 Person.prototype.call() 的简写......所以这就是我要说的。
-
仅供参考,
Person.call与Person.prototype.call不同。Person.protoype不是函数,不能调用。 -
最后一点:
greeting应该真正定义为Person.prototype.greeting,而不是在构造函数中。否则,您将无法利用原型(在实例之间共享数据)。
标签: javascript oop inheritance prototype