将功能放在另一个范围内?

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/