【发布时间】:2011-08-25 07:15:54
【问题描述】:
我有这段代码:
var Human=function(name){
this._name=name;
};
Human.prototype.Shout=function(){
alert(this._name);
};
var tom=new Human("tom");
var john=new Human("john");
alert(tom.Shout===john.Shout);
现在 ._name 不是“私有的”。我想将 ._name 设为“私有”,但同时我不希望为 Human 的每个实例创建附加函数(换句话说,tom.Shout 必须 === 到 john.Shout),因为为每个实例都很好.. 不必要(好的题外话 - 我们可以在另一个线程上讨论这个)
我的结论是,我想要实现的目标(让 ._name 为“私有”,同时拥有 tom.Shout===john.Shout)是不可能的。
但在得出任何结论之前,我只想 200% 确定。
(只要满足要求,我欢迎任何 hack,即不为每个实例创建额外的函数)
如果我们必须创建额外的函数来进行范围界定,那很好,但该数字应该是一个固定数字,并且该数字不应随着 Human 的每个额外实例而增加。
【问题讨论】:
-
也许我遗漏了一些东西,但是在 Chrome、Firefox 和 IE 以及 nodejs (v8) 中运行上面的代码 - 包裹在 中 - 都警告'true'。跨度>
-
@Rob Raisch 是的,它应该是“真”,因为这些函数是同一个实例。换句话说,我们只有 1 个功能被两个人“共享”
-
@Pacerier,由于“this”是为每个实例创建的特殊上下文,所有实例都有自己的“_name”。
-
@Pacerier 您严重高估了创建函数(在浏览器中)的成本。
-
@Pacerier,嗯...好吧,从我在其他 cmets 中读到的内容,您想将 _name 设为私有,而不是“私有”,这意味着类似于私有但实际上并非如此?您是否正在寻找一种确保实例变量真正私有的可靠方法,因为它们不能从实例外部访问?如果是这样,则没有。 Javascript 允许反射,这将“揭开真正隐私的面纱”。
标签: javascript function ecmascript-5