从原型调用私有js函数

时间:2013-09-24 13:08:42

标签: javascript oop

我整天都在阅读SO帖子,但我还没有想出任何适合我的帖子。

我有一个JS对象

function MyObject(a,b){
     this.member_a = a;
     this.member_b = b;



     function operation1(){
          $('#someDiv1').text(this.a);
     }

     function operation2(){
          $('#someDiv1').text(this.b);
     }

     MyObject.prototype.PublicFunction1 = function(){

     //There is an ajax call here
     //success
     operation1();
     //failure
     operation2();

     }
}

大致相同。这就是我现在的模式。它位于外部JS文件中。我的页面创建了MyObject(a,b),断点显示member_amember_b都已正确初始化。在我的页面调用MyObject.PublicFunction1();发生了一些其他魔法之后,ajax会执行,我会输入operation1()operation2(),但当我进入member_amember_b时都是undefined,我不明白为什么。我正在失去范围或某些东西。我有私有函数和对象体声明之外的原型,两者的组合。如何从对象的原型中调用私有函数来处理对象的数据?

我也试过

ClassBody{
vars
private function
}

prototype{
private function call
}

并且一直在阅读this

2 个答案:

答案 0 :(得分:1)

operation1operation2没有上下文,因此在全局contextthis == window)中执行。

如果您想给他们一个上下文,但要保密,请使用apply:

operation1.apply(this);
operation2.apply(this);

进一步阅读申请方法https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

修改

@FelixKing是正确的 - 你的代码应该更恰当地写成这样(使用Module Pattern):

//encapsulating scope
var MyObject = (function() {

     function operation1(){
          $('#someDiv1').text(this.a);
     }

     function operation2(){
          $('#someDiv1').text(this.b);
     }

     var MyObject = function(a,b) {
        this.member_a = a;
        this.member_b = b;
     };

     MyObject.prototype.PublicFunction1 = function(){

     //There is an ajax call here
     //success
     operation1.apply(this);
     //failure
     operation2.apply(this);

     }

     return MyObject;
}());

答案 1 :(得分:0)

我已经构建了一个工具,允许您将私有方法放到原型链上。这样,您可以在创建多个实例时节省内存分配。 https://github.com/TremayneChrist/ProtectJS

示例:

var MyObject = (function () {

  // Create the object
  function MyObject() {}

  // Add methods to the prototype
  MyObject.prototype = {

    // This is our public method
    public: function () {
      console.log('PUBLIC method has been called');
    },

    // This is our private method, using (_)
    _private: function () {
      console.log('PRIVATE method has been called');
    }
  }

  return protect(MyObject);

})();

// Create an instance of the object
var mo = new MyObject();

// Call its methods
mo.public(); // Pass
mo._private(); // Fail