将功能放在另一个范围内?
Put function in another scope?
我有一个 class(非常)简化的样子:
var myClass = (function( window ) {
function myClass(configObject) {
var instanceVar = 'something that is different for every instance of myClass';
configObject.action && configObject.action();
}
return myClass;
})(window);
现在,当我传递选项配置对象时(它可能包含理论上无限数量的函数,这些函数又引用来自 class 的变量,对于那个 class) ...
var config = {
"action": function() {
concole.log(instanceVar); // is undefined when called from myClass, because it's in another scope
}
};
var instance = new myClass(config);
... 当然,这些变量在函数范围内是不可访问的。如何将配置中的函数放入 class 范围?
我想到了 bind
,但它只改变了 this
上下文,而不是范围。我可以将变量作为参数传递给函数,但是每个函数都必须在内部检查该参数,并且关于来自外部配置对象的函数数量可能不受我的控制,我想防止将此作为先决条件。
有没有办法将函数 "clone" 放入 class 范围或类似的东西?闭包是否有任何帮助(如果有,请举例说明,因为我还没有完全了解闭包)。
谢谢!
instanceVar
是在闭包内定义的,因此除非显式传递,否则无法从外部访问它。
为了避免将它传递给每个方法的需要,您可以从 configObject 创建一个新的 configInstance,并将 instanceVar 作为 属性 添加到新实例:
var myClass = (function(window) {
function myClass(configObject) {
var instanceVar = 'something that is different for every instance of myClass';
var configInstance = Object.create(configObject, { // create a new configInstance that inherits from the origin configObject, which means that the original won't be changed
instanceVar: {
writable: false,
configurable: false,
value: instanceVar
} // add instanceVar as a member to configInstance
});
configInstance.action && configInstance.action();
}
return myClass;
})(window);
var config = {
"action": function() {
console.log(this.instanceVar);
}
};
var instance = new myClass(config);
这是我的版本
var myClass = (function( global ) {
function myClass(configObject) {
var instanceVar = 'something that is different for every instance of myClass';
configObject.action && configObject.action(instanceVar);
}
return myClass;
})(window);
var instance = myClass({
"action": function(instanceVar) {
console.log(instanceVar);
}
});
js fiddle: https://jsfiddle.net/e0pgs4vw/
我有一个 class(非常)简化的样子:
var myClass = (function( window ) {
function myClass(configObject) {
var instanceVar = 'something that is different for every instance of myClass';
configObject.action && configObject.action();
}
return myClass;
})(window);
现在,当我传递选项配置对象时(它可能包含理论上无限数量的函数,这些函数又引用来自 class 的变量,对于那个 class) ...
var config = {
"action": function() {
concole.log(instanceVar); // is undefined when called from myClass, because it's in another scope
}
};
var instance = new myClass(config);
... 当然,这些变量在函数范围内是不可访问的。如何将配置中的函数放入 class 范围?
我想到了bind
,但它只改变了 this
上下文,而不是范围。我可以将变量作为参数传递给函数,但是每个函数都必须在内部检查该参数,并且关于来自外部配置对象的函数数量可能不受我的控制,我想防止将此作为先决条件。
有没有办法将函数 "clone" 放入 class 范围或类似的东西?闭包是否有任何帮助(如果有,请举例说明,因为我还没有完全了解闭包)。
谢谢!
instanceVar
是在闭包内定义的,因此除非显式传递,否则无法从外部访问它。
为了避免将它传递给每个方法的需要,您可以从 configObject 创建一个新的 configInstance,并将 instanceVar 作为 属性 添加到新实例:
var myClass = (function(window) {
function myClass(configObject) {
var instanceVar = 'something that is different for every instance of myClass';
var configInstance = Object.create(configObject, { // create a new configInstance that inherits from the origin configObject, which means that the original won't be changed
instanceVar: {
writable: false,
configurable: false,
value: instanceVar
} // add instanceVar as a member to configInstance
});
configInstance.action && configInstance.action();
}
return myClass;
})(window);
var config = {
"action": function() {
console.log(this.instanceVar);
}
};
var instance = new myClass(config);
这是我的版本
var myClass = (function( global ) {
function myClass(configObject) {
var instanceVar = 'something that is different for every instance of myClass';
configObject.action && configObject.action(instanceVar);
}
return myClass;
})(window);
var instance = myClass({
"action": function(instanceVar) {
console.log(instanceVar);
}
});
js fiddle: https://jsfiddle.net/e0pgs4vw/