您可以使用prototype关键字向Javascript类添加函数吗?

时间:2014-04-01 18:19:03

标签: javascript

我需要能够在Javascript类中添加许多函数,我认为你可以使用className.prototype = function(){}来实现这一点,但也许我对此不正确。

  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";
 };

2 个答案:

答案 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.callFunction.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";
};