我目前正在学习javascript中的原型设计,我写下面的内容,当我使用它时似乎工作正常。我的问题是为什么我需要原型声明结束时的(),如果我试图创建一个对象的实例我得到一个错误。
var MyTest = function (agencyId, dataId) {
this.agencyId= agencyId;
this.dataId= dataId;
};
MyTest.prototype = function () {
var setObservables = function () {
...
},
init = function (url) {
...
};
// public members
return {
init: init
};
}();
使用它我称之为
var obj = new DetailsDivisionKO(1, 2);
obj.init(actionUrl);
这很好,但我对}()感到困惑;在公共成员部分结束时,为什么需要这个,我不能拥有它,仍然使用上面的代码来调用它?如果没有,如果我尝试调用上面的代码我得到一个错误说明:
Uncaught TypeError: Object [object Object] has no method 'init'
答案 0 :(得分:4)
你拥有的是 IIFE 。它是一个imidiately调用函数。您基本上是在创建 closure 。您正在暴露init函数,同时为setObservables函数保留一个真正的私有作用域。因此,每次创建构造函数的新实例时,init函数将始终位于原型中。但是setObservables不会。在您的示例中,您只能在内部访问setObservables函数(因此私有范围)。通常你会这样做,如果你只想让你的init函数调用你的私有函数,在你的情况下是setObservables。但如果这不是你想要的,你只需要这样做:
var MyTest = function (agencyId, dataId) {
this.agencyId= agencyId;
this.dataId= dataId;
};
MyTest.prototype = {
setObservables: function () {
...
},
init: function (url) {
...
}
}
现在每次你创建一个新的MyTest实例时,你的两个函数都将在它的原型中。
var test = new MyTest(1, 2);
test.init();
test.setObservables();