javascript封装 - 任何访问私有成员给定实例的方法?

时间:2011-04-16 00:24:17

标签: javascript

在给定实例变量的情况下,是否可以在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?

5 个答案:

答案 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

现场演示: http://jsfiddle.net/simevidas/j7VtF/

答案 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

Live example

基本上你有两个对象。您传递给客户端的真实对象和代理对象。除了通过代理方法和变量之外,代理不能访问真实状态。

但它确实有一个注入方法,允许您从代理

将方法注入到真实对象中

答案 3 :(得分:0)

在您的示例中,变量x是构造函数的本地变量,并且一旦该函数超出范围,其值就不会保留。但是,您可以将值分配给对象的命名属性,例如:

var Foo = function() {
  this.x = 12;
}
var f = new Foo();
f.x; // => 12
f.x = 123; // => 123

答案 4 :(得分:0)

javascript中的私有成员附加到对象,但它们不能被外部访问,也不能访问对象自己的公共方法。它们可以通过私人方法访问。私有方法是构造函数的内部函数。

您需要一个公共函数,它访问最终访问私有成员的私有内部函数。

参考:Better way to access private members in Javascript