代码之家  ›  专栏  ›  技术社区  ›  David Hellsing

原型javascript中的全局实例

  •  0
  • David Hellsing  · 技术社区  · 14 年前

    我正在探索一种模式,您可以在其中保存对当前实例的全局引用,以便在匿名函数中简单使用,其中 this 关键字超出上下文。考虑一下:

    var instance;
    
    var a = function(id) {
      instance = this;
      this.id = id;
    };
    
    a.prototype.get = function() {
      return (function() {
        return instance.id;
      })();
    };
    
    
    var x = new a('x');
    var y = new a('y');
    
    console.log(x.get());
    console.log(y.get());
    

    显然,这不起作用,因为每次都在构造函数中定义实例 .get() 被称为 instance 将引用上一个构造的对象。所以它会同时产生“y”。

    但是,我正在寻找一种方法,不使用 关键字,使代码更具可读性。在这里单例不是一个选项,我需要原型继承。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Community omersem    7 年前

    编辑 :由于您避免存储“本地实例”,因此有一些方法,例如:

    使用 call apply 改变 this 被调用函数的值:

    var a = function (id) {
      this.id = id;
    };
    
    a.prototype.get = function () {
    
      return (function() {
        return this.id; // the inner `this` value will refer to the value of outside
      }).call(this); 
    };
    

    使用参数:

    //..
    a.prototype.get = function () {
    
      return (function(instance) {
        return instance.id;
      })(this); 
    };
    

    新的EcmaScript第5版介绍了 bind 方法,这对于保持 值和可选的绑定参数,可以找到兼容的实现 here :

    //..
    a.prototype.get = function() {
      var boundFunction = (function () {
        return this.id;
      }).bind(this);
    
      return boundFunction(); // no matter how the function is invoked its `this`
    };                        // value will always refer to the instance.