使用Object.DefineProperty并访问私有范围中的变量

Mat*_*att 4 javascript closures defineproperty

以下不起作用,从我的getter中,我看不到_nickname'class'中定义的Person.

var Person = function (args) {

    var _nickname = '';
    if (args === undefined || args === null) {
        return;
    }
    if (args.nickname !== undefined && args.nickname !== null) {
        _nickname = args.nickname;
    }

}

Object.defineProperty(Person.prototype, "nickname", {
    get : function () {
        return _nickname;
    }
});

var x = new Person({
        nickname : 'bob'
    });

console.log(x.nickname);
Run Code Online (Sandbox Code Playgroud)

如何实现这一目标呢?有没有办法在函数中将_nickname添加到Person的原型中?

bfa*_*tto 5

有没有办法在函数中将_nickname添加到Person的原型中?

如果你的意思是Person构造函数,肯定(虽然在我看来它看起来不是很优雅):

var Person = function (args) {
    var _nickname = '';
    if (args === undefined || args === null) {
        return;
    }
    if (args.nickname !== undefined && args.nickname !== null) {
        _nickname = args.nickname;
    }
    Object.defineProperty(this, "nickname", {
        get : function () {
            return _nickname;
        }
    });
}

var x = new Person({
    nickname : 'bob'
});

console.log(x.nickname);
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/JEbds/

在这种情况下,你的getter只是另一个闭包,所以它可以访问_nickname.而且它不再是原型,你需要一个自己的财产来实现这一目标.

  • @Matt 确实没有好的方法来拥有私有实例值属性(每个实例具有唯一私有值的属性)。您可以在原型或共享值属性上共享“私有”函数,其中值在所有实例之间共享。“私有”函数:http://stackoverflow.com/questions/18320934/how-to-call-parent-class-method-from-a-subclass-in-javascript-so-that-parents/18325012#18325012 使用构造函数函数和原型:http://stackoverflow.com/questions/16063394/prototypical-inheritance-writing-up/16063711#16063711 (3认同)