如何使构造函数参数可用于原型函数JavaScript

时间:2014-06-21 21:01:06

标签: javascript oop

在下面的简化示例中,MyService.doSomething函数可以访问someDependency,因为原型函数是在MyService构造函数中定义的。

// Define MyService Class
function MyService(someDependency) {
   MyService.prototype.doSomething = function(){
      return someDependency.doSomething();
   }
}

使用具有给定依赖关系的MyService

// Construct MyService
var myService = new MyService(someDependency);
var result = myService.doSomething();

我很确定这是不好的做法,但如何使构造函数参数someDependency可用于该函数?

2 个答案:

答案 0 :(得分:2)

首先,您应该在定义构造函数的同时初始化原型,而不是在每次创建新实例时重新定义它。

// Define MyService Class
function MyService(someDependency) {
    // ...
}

MyService.prototype.doSomething = function(){
    // ...
}

之后,剩下要做的就是将参数明确地复制到实例变量中

// Define MyService Class
function MyService(someDependency) {
   this.someDependency = someDependency;
}

MyService.prototype.doSomething = function(){
  return this.someDependency.doSomething();
}

所有实例变量都是piublic。如果需要,可以使用命名约定(如以下划线开头)来标记“伪私有”变量。

如果要直接使用函数参数而不是分配实例变量,则可以使方法成为属于对象的闭包,而不是原型中的sharred函数。这允许您使用构造函数中的变量(这些变量是私有的!)但是使创建子类变得更加困难。

function MyService(someDependency) {
    this.doSomething = function(){
        return someDependency.doSomething();
    };
}

带闭包的版本可能比原型版本慢,但我大部分时间都不会担心。

答案 1 :(得分:1)

嗯,常见的方法是 - 如果一个对象有一个属性,它实际上应该拥有该属性。

function MyService(someDependency) {
    this.dependency = someDependency; // set it on the object
}

MyService.prototype.doSomething = function(){
   return this.dependency.doSomething(); // now the prototype can access it
}

你也是对的,至少在某种意义上,你目前正在做的方式是不好的 - 额外的关闭会让它变慢。至于可读性 - 我发现它更难阅读,但这是值得商榷的。它还使得通过原型继承进行子类化和扩展变得更加困难。