javascript - 如何使构造函数参数可用于原型(prototype)函数 JavaScript

标签 javascript oop

在下面的简化示例中,MyService.doSomething 函数可以访问 someDependency,因为原型(prototype)函数是在 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 可用于该函数?

最佳答案

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

// 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();
}

所有实例变量都是公开的。如果您愿意,可以使用命名约定(例如以下划线开头)来标记“伪私有(private)”变量。

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

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

带闭包的版本可能比原型(prototype)版本慢,但大多数时候我不会担心 i。

关于javascript - 如何使构造函数参数可用于原型(prototype)函数 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24345819/

相关文章:

javascript - 如何禁用 jquery 移动弹出窗口的关闭

java - 实现构建器模式时无法将字符串转换为构建器类错误

java - 检查字符串和对象

javascript - 根据文本字段输入的数据更改窗口的背景颜色

javascript - 使用 .parent 选择 div

javascript - 动态计算多个选择选项数据值

javascript - 如何获得类似于 iframe 提供的 div 隔离级别?

python - 如何避免不小心弄乱Python中的基类?

c# - 将类对象传递给 WebService

ios - 在 Objective-C 中使用状态设计模式