在下面的简化示例中,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
可用于该函数?
答案 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
}
你也是对的,至少在某种意义上,你目前正在做的方式是不好的 - 额外的关闭会让它变慢。至于可读性 - 我发现它更难阅读,但这是值得商榷的。它还使得通过原型继承进行子类化和扩展变得更加困难。