在给定实例变量的情况下,是否可以在javascript中访问私有成员?例如,
function class Foo() {
var x=12;
// some other stuff
}
F = new Foo();
// how to get/set F.x?
更新:作为一种扭曲,假设该类具有特权方法。是否有可能劫持这种特权方法来访问私有成员?
function class Foo() {
var x=12, y=0;
this.bar = function(){ y=y+1; }
}
F = new Foo();
// can I modify Foo.bar to access F.x?
答案 0 :(得分:5)
您需要privileged method来获取/设置x
的值:
function Foo() {
var x = 12;
this.getX = function() { return x; };
this.setX = function(v) { x = v; };
}
var f = new Foo(),
g = new Foo();
f.getX(); // returns 12
g.getX(); // returns 12
f.setX(24);
f.getX(); // returns 12
g.getX(); // returns 24
g.setX(24);
f.getX(); // returns 24
g.getX(); // returns 24
答案 1 :(得分:3)
如果真的希望像这样访问,你可以这样做,但我 真的 不建议:
function Foo() {
var x = 12;
this.runContext = function(f) {
return eval(f);
};
}
var f = new Foo();
f.runContext('alert(x);');
答案 2 :(得分:2)
您可以使用某种模式编写代码来实现此目的。
我将在underscore的帮助下演示来演示。
function Construct() {
this.foo = "foo";
this._private = "bar";
this.method = function() {
return 42;
};
this._privateMethod = function() {
return "secret";
};
var that = this;
var inject = function(name, f) {
this[name] = _.bind(f, that);
};
_.bindAll(this);
return {
"foo": this.foo,
"method": this.method,
"inject": inject
};
}
var c = new Construct();
console.log(c.foo); // foo
console.log(c.method()); // 42
c.inject("foo", function() {
console.log(this._private);
console.log(this._privateMethod());
});
c.foo(); // bar, secret
基本上你有两个对象。您传递给客户端的真实对象和代理对象。除了通过代理方法和变量之外,代理不能访问真实状态。
但它确实有一个注入方法,允许您从代理
将方法注入到真实对象中答案 3 :(得分:0)
在您的示例中,变量x
是构造函数的本地变量,并且一旦该函数超出范围,其值就不会保留。但是,您可以将值分配给对象的命名属性,例如:
var Foo = function() {
this.x = 12;
}
var f = new Foo();
f.x; // => 12
f.x = 123; // => 123
答案 4 :(得分:0)
javascript中的私有成员附加到对象,但它们不能被外部访问,也不能访问对象自己的公共方法。它们可以通过私人方法访问。私有方法是构造函数的内部函数。
您需要一个公共函数,它访问最终访问私有成员的私有内部函数。