在下面的简化示例中,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/