JavaScript中的私密性

我知道你可以通过使用闭包和立即调用函数在 JavaScript中实现“私有性”.

但是,如果我需要全功能原型设计呢?我根本不知道在对象的原型中有私有成员.如果我使用特权方法,我可以拥有私有变量和公共方法,但我失去了原型设计的选项.

Douglas Crockford“禁止”使用悬空(在标识符前加上下划线表示它不是公共接口的一部分).

但使用它是不是很糟糕?因为没有办法让它真正私密.

你对此有何看法?你怎么处理它?

首先,在使用功能继承模式时,您并没有真正失去原型效果.我只是假设你在谈论好的部分,crockford还介绍了一种非常简单有效的方法来为该模式提供共享变量.基本上看起来像:

var Human = (function(my, priv) {
    var my   = my || {},
        priv = priv || {};

    my.privatedata = "foobar";

    priv.walk = function() {
        console.log('walking');
        return priv;
    };
    priv.talk = function() {
        console.log('blah blah');
        return priv;
    };

    return priv;
}());

var Andy = (function(my, priv) {
    var my   = my || {},
        priv = Human(my, priv);

    priv.SpecialAndyThing = function() {
        console.log('bloggin at typeofnan.com');
        return priv;
    };

    return priv;
}());

var myAndy = Andy();
myAndy.talk().SpecialAndyThing();

你甚至可以简单地扩展这项技术,以获得一些超级方法.使用隐含变量约定(如下划线或诸如此类的东西)通常只是不好的做法.它令人困惑,因为没有人知道那里发生了什么(如果你是唯一一个使用代码库的人,那么这个论点可能会失败).

但是,ECMAscript Edition 5引入了一些好处,以便在原型链中拥有更多“私有”成员.一个重要的方法是.defineProperty,您可以在其中定义一个不“浅”的属性.看起来像:

var Human = {};

Object.defineProperty(Human, 'privateStuff', {
    value:      'secret',
    enumerable: false
});

现在,属性privateStuff对于从Human的原型链继承的对象是不可见的.无论如何,这个东西需要Javascript 1.8.5,目前仅在尖端浏览器中可用.见https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty

相关文章
相关标签/搜索