javascript原型如何创建对象

时间:2014-01-07 18:52:06

标签: javascript

我目前正在学习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' 

1 个答案:

答案 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();