我有这样的代码:
function Food(type) {
this.type = type;
this.timesEaten = 0;
}
Food.prototype.eat = function() { // Dependent function
this.timesEaten++;
}
Food.prototype.pasta = function() { // In-dependent function
return new Food("pasta")
}
所以,我希望能够在不定义新食物的情况下使用面食功能,如下所示:
var pasta = Food.pasta()
Buut,这不起作用,你必须这样做:
var pasta = new Food().pasta()
好吧“Food.pasta()”如果您像这样设置食物确实有效:
var Food = {
pasta: function() {
return {type: pasta};
}
}
但是新的食物将不起作用,这意味着我将不得不使用“return {type:pasta}”。
我想知道,有没有办法创造一种可以依赖和独立的食物?
答案 0 :(得分:6)
function Food(type) {
this.type = type;
this.timesEaten = 0;
}
Food.prototype.eat = function() { // Dependent function
this.timesEaten++;
}
Food.pasta = function() { // In-dependent function
return new Food("pasta")
}
Food.prototype
个函数仅适用于Food
的对象,而Food.pasta
Food
只是一个命名空间对象。
用法:
Food.pasta();
答案 1 :(得分:6)
像.pasta()
方法那样不对任何实例数据进行操作的方法称为静态方法。您不希望它在原型上,因为原型只会在实例化对象的查找链中(通过执行Food
创建实际的new Food()
对象之后)。
相反,对于静态方法,您可以将它放在构造函数本身上,如下所示:
Food.pasta = function() {
return new Food("pasta");
}
你可以这样称呼它:
var pasta = Food.pasta();
有用的是要记住,在javascript中,函数也是对象,所以它们可以有属性/方法,当你正在寻找放置静态函数或不属于特定实例化对象的数据的地方或者需要时在一个特定的实例化对象上调用,Constructor对象通常是放置它们的好地方。