我整天都在阅读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_a
和member_b
都已正确初始化。在我的页面调用MyObject.PublicFunction1();
发生了一些其他魔法之后,ajax会执行,我会输入operation1()
或operation2()
,但当我进入member_a
和member_b
时都是undefined
,我不明白为什么。我正在失去范围或某些东西。我有私有函数和对象体声明之外的原型,两者的组合。如何从对象的原型中调用私有函数来处理对象的数据?
我也试过
ClassBody{
vars
private function
}
prototype{
private function call
}
并且一直在阅读this
答案 0 :(得分:1)
operation1
和operation2
没有上下文,因此在全局context
(this == 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