可以使用prototype关键字向Javascript类添加函数吗?
我需要能够将许多函数添加到Javascript类中,我认为可以使用className.prototype=function(){}来实现这一点,但可能我在这一点上不正确可以使用prototype关键字向Javascript类添加函数吗?,javascript,Javascript,我需要能够将许多函数添加到Javascript类中,我认为可以使用className.prototype=function(){}来实现这一点,但可能我在这一点上不正确 Car.prototype.toAnotherString = function () { return this.model + " has done " + this.miles + " miles"; }; 问题:这个类中的原型声明正确吗?在没有函数名的情况下,类Car如何声明> function Car
Car.prototype.toAnotherString = function () {
return this.model + " has done " + this.miles + " miles";
};
问题:这个类中的原型声明正确吗?在没有函数名的情况下,类Car如何声明>
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";
};
}
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";
};
不,不是:在
汽车上定义方法的行。原型应单独放置:
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.toatotherstring()
时,在toatherstring
内部,此对象将引用与civic
相同的对象。当您调用mondeo.toatotherstring()
时,此将引用与mondeo
相同的对象
但是等等,还有更多!您可以取消一个对象的此方法,同时传递另一个对象作为其上下文(即,this
):
而且,你瞧,尽管该方法似乎属于civic
对象,但实际上它的作用就像是附加在mondeo
one上一样
这是JS最强大的功能之一,可以在方法内部切换这。我建议学习(真的,没有双关语)关于MDN的教程,以及关于和的相应文章。不,不是:定义汽车方法的那一行。原型应单独放置:
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.toatotherstring()
时,在toatherstring
内部,此对象将引用与civic
相同的对象。当您调用mondeo.toatotherstring()
时,此将引用与mondeo
相同的对象
但是等等,还有更多!您可以取消一个对象的此方法,同时传递另一个对象作为其上下文(即,this
):
而且,你瞧,尽管该方法似乎属于civic
对象,但实际上它的作用就像是附加在mondeo
one上一样
这是JS最强大的功能之一,可以在方法内部切换这。我建议学习(实际上,没有双关语)关于MDN的教程,以及关于和的相应文章。原型应该在初始化函数之外完成,如下所示:
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";
};
原型应在初始化函数之外完成,如下所示:
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吗”这是什么意思?只是为了澄清术语,javascript中没有类。这里有一个构造函数,它将在关键字“新”使用时创建新的汽车实例。我的意思是,我可以创建一个对象,其中的Word函数更像C++或java风格的代码吗?是的,你可以做到。但是,在构造函数内部声明它们会使它在每次创建新实例时都被覆盖。“在没有函数名的情况下如何声明类Car”这是什么意思?只是为了澄清术语,javascript中没有类。这里有一个构造函数,它将在关键字“新”使用时创建新的汽车实例。我的意思是,我可以创建一个对象,其中的Word函数更像C++还是java风格的代码?我只是快速读取了调用和应用函数,但是我没有真正得到参数列表中有这个的部分。你能解释一下吗?在我的回答中用call
检查这个例子-因为mondeo
作为第一个参数传递到那里,所以mondeo
对象将被认为是中的这个到另一个字符串而不是civic
(或其他任何东西).我只是快速阅读了调用和应用函数,但我没有真正了解参数列表中有this的部分。你能解释一下吗?在我的回答中用call
检查这个例子-因为mondeo
作为第一个参数传递到那里,所以mondeo
对象将被认为是中的这个到另一个字符串而不是civic
(或其他任何东西)。