【发布时间】:2017-06-01 13:35:21
【问题描述】:
假设您想要一个提供一些方法的单个 JavaScript 对象,如下所示:
var a = {
c: "hello",
talk: function(){
console.log(this.c);
}
}
但是您不希望人们能够直接访问 c,您希望它是私有的。我已经想出了这个解决方案,但我不知道是否有更好的解决方案:
var a = new function(){
var c = "hello";
this.talk = function(){
console.log(c);
};
}
你能想出更好的解决方案吗?你能说出为什么它更好吗?
您能否指出这种方法可能给我带来的任何问题(性能、可维护性或其他)?
我在这里留下一个额外的例子,我认为这在概念上可能有用:
var Animation = {
from_right: "translate(100%,0)",
from_bottom: "translate(0,100%)",
zoom: "translate(0,0) scale(0)",
default: "translate(100%,0)",
get_initial: function(type){
switch (type) {
case "from_right":
case "from_bottom":
case "zoom":
return this[type];
break;
default:
return this["default"];
break;
}
},
get_final: function(){
return "translate(0,0) scale(1)";
}
}
我知道这完全像这样工作,但对我来说,从概念上讲,使用或查看它以将这些第一个配置属性作为私有变量时会更清楚。例如,如果我记录 Animation 并发现它有 2 个方法,我会比打印所有不应该访问的属性更快地意识到如何使用它。这不是关于如何做某事,而是关于如何将它做得更清晰更好。
谢谢!
【问题讨论】:
-
第一步:为什么
c一开始就是“私人的”那么重要?是的,封装给了你“隐私”(注意引号),但它也迫使你在编码方面向后弯腰。除非您有非常好的理由,否则我对这个问题的建议始终是不要担心。 -
这是正确的。在顶层作为变量公开的任何内容都是私有的。如果使用 getter 和 setter,这非常有用。 @deceze 如果您没有人操纵该特定值并希望它不可变,您会想要这样做。
-
@Vandervals 我对这个主题不是很了解,但我相信“隐藏”变量的主要论点(因为没有更好的术语)是保持算法的连贯性,而你会公开一些参数以启用配置算法。您希望您提供给其他开发人员(甚至“未来自己”)的模块或代码片段足够灵活以适应他们的需求,但又足够严格,不会以您不会的方式偏离其既定目的想要记录,而开发人员“配置”它可能没想到
-
@deceze 完全是为了理智。如果私有变量的范围在闭包内,那么它也确实存在。它只能在该特定范围内访问,除此之外没有任何东西可以访问它,用户也不能访问它。有这样做的用例。最大的问题之一是不污染命名空间。
标签: javascript private