我需要能够在Javascript类中添加许多函数,我认为你可以使用className.prototype = function(){}来实现这一点,但也许我对此不正确。
Car.prototype.toAnotherString = function () {
return this.model + " has done " + this.miles + " miles";
};
问题:我在这个类中正确声明了原型,并且可以通过函数名称>
声明类Carfunction Car( model, year, miles ) {
this.model = model;
this.year = year;
this.miles = miles;
this.toString = function () {
return this.model + " has done " + this.miles + " miles";
};
Car.prototype.toAnotherString = function () {
return this.model + " has done " + this.miles + " miles";
};
}
var civic = new Car( "Honda Civic", 2009, 20000 );
var mondeo = new Car( "Ford Mondeo", 2010, 5000 );
console.log( civic.toString() );
console.log( mondeo.toString() );
console.log( civic.toAnotherString() );
console.log( mondeo.toAnotherString() );
新守则:
这就是原型应该如何添加。
function Car( model, year, miles ) {
this.model = model;
this.year = year;
this.miles = miles;
this.toString = function () {
return this.model + " has done " + this.miles + " miles";
};
}
Car.prototype.toAnotherString = function () {
return this.model + " has done " + this.miles + " miles";
};
答案 0 :(得分:2)
不,不是:Car.prototype
上定义方法的行应单独放置:
function Car (model, year, miles) {
this.model = model;
this.year = year;
this.miles = miles;
this.toString = function () {
return this.model + " has done " + this.miles + " miles";
};
}
Car.prototype.toAnotherString = function () {
return this.model + " has done " + this.miles + " miles";
};
请参阅,原型的主要优点是只需一次即可创建方法功能。但是在你的代码中,每次调用Car
构造函数时都会执行这一行,一次又一次地创建一个新的函数实例。这违背了原型的目的。
但是你可能会问这个函数如何知道它所要求的对象?这完成了所谓的函数上下文欺骗。请注意,当您致电civic.toAnotherString()
时,toAnotherString
this
内部对象将引用与civic
相同的对象。当您致电mondeo.toAnotherString()
时,this
会引用与mondeo
相同的对象。
但等等,还有更多!您可以从一个对象调用此方法,然后将另一个对象作为其上下文传递(即this
):
civic.toAnotherString.call(mondeo); // or .apply(mondeo)
而且,请注意,即使该方法似乎属于civic
对象,它实际上就像是附加到mondeo
一个。
这个 - 在方法中切换this
的能力 - 是最强大的JS功能之一。我建议在MDN上下学习this(真的,没有双关语)教程,以及Function.call,Function.apply和{{3}上的相应文章}。
答案 1 :(得分:2)
原型设计应该在初始化功能之外完成,如下所示:
function Car( model, year, miles ) {
this.model = model;
this.year = year;
this.miles = miles;
this.toString = function () {
return this.model + " has done " + this.miles + " miles";
};
}
Car.prototype.toAnotherString = function () {
return this.model + " has done " + this.miles + " miles";
};