javascript - JavaScript 中的隐私

标签 javascript inheritance prototype closures

我知道您可以通过使用闭包和立即调用函数在 JavaScript 中实现“隐私”。

但是如果我需要全功能原型(prototype)设计怎么办?我根本不知道在对象的原型(prototype)中有私有(private)成员。如果我使用特权方法,我可以拥有私有(private)变量和公共(public)方法,但我失去了原型(prototype)设计的选择。

Douglas Crockford“禁止”使用悬空(在标识符前放置下划线以表明它不是公共(public)接口(interface)的一部分)。

但是使用它有那么糟糕吗?因为没有办法让它真正私有(private)。

您对此有何看法?你是怎么处理的?

最佳答案

首先,使用功能继承模式时,您并没有真正失去原型(prototype)制作效果。我只是假设您在谈论好的部分,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();

您甚至可以简单地扩展此技术以拥有某种 super 方法。使用下划线或诸如此类的神秘变量约定通常只是不好的做法。它令人困惑,因为没有人知道那里发生了什么(如果您是唯一使用代码库的人,那么该论点可能会失败)。


但是,ECMAscript 第 5 版引入了一些好东西,可以在原型(prototype)链中拥有更多“私有(private)”成员。一个重要的方法是 .defineProperty,您可以在其中定义一个不会“浅”透的属性。看起来像:

var Human = {};

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

现在,privateStuff 属性对于从 Human 的原型(prototype)链继承的对象是不可见的。无论如何,这些东西需要 Javascript 1.8.5,并且目前只能在最先进的浏览器中使用。参见 https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty

关于javascript - JavaScript 中的隐私,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5140833/

相关文章:

javascript - Vue.js 组件不会渲染

javascript - jQuery 遍历列表项并获取 data-imgid 属性值

Python将一个类的属性继承给另一个类

javascript - 原型(prototype)方法中的 'this'指向什么?

JavaScript 的 *this* 关键字从 string.prototype 中指向窗口

javascript - 基于原型(prototype)的语言

javascript - Angularjs Controller 不是一个函数,在创建工厂文件后未定义

Javascript 准确地将 HSB/HSV 颜色转换为 RGB

inheritance - 如何使用 yaml 在 dostr2 中对继承进行建模?

java - 在参数中使用泛型集合