javascript - 您可以使用原型(prototype)关键字将功能添加到JavaScript类中吗?

标签 javascript

我需要能够向 Javascript 类添加许多函数,我认为您可以使用 className.prototype = function(){} 来做到这一点,但也许我在这一点上不正确。

  Car.prototype.toAnotherString = function () {
    return this.model + " has done " + this.miles + " miles";
  };

问题:在此类中是否正确声明了原型(prototype),并且可以在没有函数名称的情况下以某种方式声明 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() );

新代码:

这就是添加原型(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.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";
};

看,原型(prototype)的主要优点是能够一次创建方法函数。但在您的代码中,每次调用 Car 构造函数时都会执行此行,从而一次又一次地创建该函数的新实例。这违背了原型(prototype)的目的。

但是您可能会问,这个函数如何知道它所调用的对象?这是通过所谓的函数上下文欺骗来完成的。看,当您调用 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.applyFunction.bind 的相应文章。

关于javascript - 您可以使用原型(prototype)关键字将功能添加到JavaScript类中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22793775/

相关文章:

javascript - 允许在使用 jQuery 循环时切换元素

javascript - 使用 AngularJS 自定义 HTML5 视频播放器控件

javascript - 根据窗口的宽度调整 iframe 的大小

javascript - 使 getBounds() 在外部函数中工作

javascript - 如何向类添加方法而不创建扩展它的新类。

javascript - 单击菜单项更改 HTML 内容

javascript - Socket IO 在本地机器上工作正常但在 Heroku 上不工作

Javascript 装饰器模式 - 原型(prototype)还是单一函数?

javascript - 如何使用更多的javascript修改页面中的javascript?

javascript - 如何制作一个由 javascript 覆盖的幻灯片?