2013-09-24 66 views
1

我一直在阅读SO帖子,我还没有想出任何对我有用的东西。从原型调用私人js功能

我有一个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

+1

分配给构造内的原型函数是错误的。请参阅[我的答案](http://stackoverflow.com/a/17393153/218196)了解原型和构造函数的用途。 –

+0

我已经重新安排我的代码以匹配。但是,当我输入原型函数时,我拥有所有的类变量,在ajax调用结束时,它们全部返回到未定义状态,唯一设置的是从调用返回的那些变量。它就像在ajax被调用后的某个时刻重新插入。我不明白。我可能会认为JS类= C#类,并且在翻译时丢失了一些东西。 – Bmo

回答

1

operation1operation2没有一个框架,并且在全球context(其中this == window)因此被执行。

如果你想给他们一个方面,但让他们私人的,然后使用适用于:

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; 
}()); 
+0

谢谢先生,我知道这是与范围和背景有关,但我无法弄清楚。像冠军一样工作。接受几分钟。虽然我会说,我有点难过,因为它们是在对象的块中定义的,他们能够以这种方式来断言/假定上下文。 – Bmo

+2

@Bmo:分配给构造函数内的原型是错误的!当您使用构造函数创建多个实例时,您会看到问题。也许你更喜欢这个解决方案之后:http://stackoverflow.com/q/55611/218196。 –

+0

我原本在外面有他们,但当我进入“为什么它不工作?!”模式我有点松散goosey与安置。从http://www.phpied.com/3-ways-to-define-a-javascript-class/请参阅1.2 – Bmo

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