2017-01-31 66 views
0

我正在尝试开发一个由更多部分组成的函数库以正常工作。从原型函数(IIFE)访问实例公共属性

var Brain = (function() { 
    var publics = { 
     studies: { 
      "ManagedVehicles": "\\Brain\\Studies\\ManagedVehicles" 
     } 
    }; 

    publics.study = function (study) { 
     if (! publics.studies.hasOwnProperty(study)) { 
      throw new BrainInvalidStudy(study + " study does not exist."); 
     } 

     return new BrainStudy(study); 
    } 

    return publics; 
}()); 

function BrainInvalidStudy(message) { 
    this.message = message; 
    // Use V8's native method if available, otherwise fallback 
    if ("captureStackTrace" in Error) 
     Error.captureStackTrace(this, BrainInvalidStudy); 
    else 
     this.stack = (new Error()).stack; 
} 

var BrainStudy = (function() { 

    function BrainStudy (study) { 
     this.study = study; 
    } 

    BrainStudy.prototype = (function (userId) { 
     var publics = {}; 
     var self = this; 

     console.log(this); 

     function query (data) { 
      return $.ajax('/api/brain/study', { 
       data: data 
      }); 
     } 

     publics.of = function (userId) { 
      return new Promise(function (resolve, reject) { 
       console.log(this); // window 
       console.log(self); // window 
       console.log(self.study); // undefined 

       query({ 
        what: self.study, 
        who: userId 
       }).done(function (response, textStatus, jqXHR) { 
        resolve(response); 
       }).fail(function (jqXHR, textStatus, errorThrown) { 
        reject(); 
       }) 
      }); 
     } 

     return publics; 
    }()); 

    return BrainStudy; 
}()); 

BrainInvalidStudy.prototype = Object.create(Error.prototype); 
BrainInvalidStudy.prototype.name = "BrainInvalidStudy"; 
BrainInvalidStudy.prototype.constructor = BrainInvalidStudy; 

的问题是,console.log(self.study)总是undefined,这将阻止我使用从基地脑类的构造函数中定义的属性。

我读过其他类似的问题,但没有一个像我这样使用IIFE。

编辑:谢谢大家,大家好,我用两个答案的组合,这里的最终结果是:

var BrainStudy = (function() { 

    function BrainStudy (study) { 
     this.study = study; 
    } 

    (function (prototype) { 
     function query (data) { 
      return $.ajax('/api/brain/study', { 
       data: data 
      }); 
     } 

     prototype.of = function (userId) { 
      var self = this; 

      return new Promise(function (resolve, reject) { 
       query({ 
        what: self.study, 
        who: userId 
       }).done(function (response, textStatus, jqXHR) { 
        resolve(response); 
       }).fail(function (jqXHR, textStatus, errorThrown) { 
        reject(); 
       }) 
      }); 
     } 
    }(BrainStudy.prototype)); 

    return BrainStudy; 
}()); 
+0

你如何创建你的'BrainStudy'。你使用'新的BrainStudy()'?似乎没有使用'new'运算符创建此对象的问题 – VadimB

+0

我正在使用它,查看Brain模块,'study()'方法。 – GiamPy

+0

是的,但你怎么称呼你的'''方法?你'this'是这种情况应该是你的类实例的指针,而不是'window'。在你调用'''方法的地方分享你的代码 – VadimB

回答

1

你应该c reate的self变量内部public.of

publics.of = function (userId) { 
    var self = this; 
    return new Promise(function (resolve, reject) { 

     query({ 
      what: self.study, 
      who: userId 
     }).done(function (response, textStatus, jqXHR) { 
      resolve(response); 
     }).fail(function (jqXHR, textStatus, errorThrown) { 
      reject(); 
     }) 
    }); 
} 

目前self等于window,因为它是在一个匿名功能初始化,并且不以任何对象的上下文。

1

您的上下文不BrainStudy,试试这个

function BrainStudy (study) { 
    this.study = study; 
} 

(function(proto) { 
    function log(args) { 
    console.log(args); 
    } 

    proto.of = function() { 
    log(this.study); 
    }; 

})(BrainStudy.prototype); 

var b = new BrainStudy(12); 
b.of(); 

function BrainStudy (study) { 
    this.study = study; 
} 

BrainStudy.prototype = (function() { 
    var proto = {}; 
    function log(args) { 
    console.log(args); 
    } 

    proto.of = function() { 
    var self = this; 
    log(this.study); 
    log(self.study); 
    }; 
    return proto; 
})(); 

var b = new BrainStudy(12); 
b.of(); 
相关问题