gpt4 book ai didi

javascript - JavaScript 中的隐私

转载 作者:搜寻专家 更新时间:2023-11-01 05:26:22 25 4
gpt4 key购买 nike

我知道您可以通过使用闭包和立即调用函数在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com