【问题标题】:Correct syntax to preserve javascript context with prototyping正确的语法以使用原型保留 javascript 上下文
【发布时间】:2013-04-15 02:16:26
【问题描述】:

所以我知道我可以使用bind 修复下面的模块类的范围,就像在this answer 中一样。

唯一的问题是我对我的模块使用了稍微不同的语法,我不太确定如何应用它?

我的问题是,如何正确地将绑定应用到我的函数,以便this 的上下文是我的模块?

代码:

var module = (function () {

    var module = function (name) {

        this.getName= function() {
            return name;
        }

    };

    module.prototype = {

        something: function () {
            // my function needs to access getName from here...
        }
    };

    return module;
})();

用法:

var foo = module('nameValue');
foo.something();

【问题讨论】:

    标签: javascript


    【解决方案1】:

    您确定在这种情况下使用 apply 而不是 bind 不是更好的实现方式吗?

    如果您只是想让类属性在模块化设置中可供访问,则需要在类函数声明中公开它们。然后,它们将可供使用这些方法的公共访问。

    var module = (function () {
    
        function module (name) {
    
            // public method exposing *name* variable with "privileged" access
            this.getName= function() {
                return name;
            }
    
            // publicly exposing *name* variable itself (ahh! It's naked!)
            // this.name = name; // use only for read+write access to variable
    
        };
    
        // only setting one prototype parameter here so let's save some lines...
        module.prototype.something =  function () {
    
                return this.getName(); // or
                // return this.name // for direct variable exposure
    
        };
    
        return module;
    })();
    

    然后你可以创建你的实例:

    var mod1 = new module("bar");
    var mod2 = new module("foo");
    var mod3 = new module("win");
    

    稍后再应用绑定...

    尽管使用 apply,您可以这样做:

    var getNameOfModule = function(){ return this.getName(); }
    getNameOfModule.apply(mod1); // bar
    getNameOfModule.apply(mod2); // foo
    getNameOfModule.apply(mod3); // win
    


    这完全取决于您的设置结构。


    此外,最好以大写开头的类名(如 Module 与 module)。

    【讨论】:

      【解决方案2】:

      您可能想先创建一个匿名函数,然后设置其他函数,然后使用对模块对象的自引用调用 getName()。

      var module = function () {
      
          var module = function(){};
      
          module.getName = function (name) {
              return name;
          };
      
          var self = module;
      
          module.prototype.something = function () {
              alert(self.getName('myName'));
          };
      
          return module;
      };
      
      var myMod = module();
      myMod.prototype.something();
      

      这是http://jsfiddle.net/ybfjB/的实时示例

      【讨论】:

      • 你认为 myMod.prototype.something();是写javascript的好方法吗?
      • @KhanhTo 调用时不需要.prototype 部分,可能是意外(或未知)
      • 在上面的代码中,name参数的使用是整个模块的构造函数的形式,你的不支持——我会随着使用情况更新。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      相关资源
      最近更新 更多