我正在尝试开发一个由更多部分组成的函数库以正常工作。从原型函数(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;
}());
你如何创建你的'BrainStudy'。你使用'新的BrainStudy()'?似乎没有使用'new'运算符创建此对象的问题 – VadimB
我正在使用它,查看Brain模块,'study()'方法。 – GiamPy
是的,但你怎么称呼你的'''方法?你'this'是这种情况应该是你的类实例的指针,而不是'window'。在你调用'''方法的地方分享你的代码 – VadimB