封装是OO编程的核心内容。
但是,如果您将某个函数设为私有,然后将其返回以便可以使用它,则可以有效地执行此操作。
我想不会,那是b.c.如果你返回一个函数,你没有返回它的副本...你正在返回一个引用。这是问题的核心。返回函数时,它是副本还是对实际函数的引用。
下面的代码是否保持func1私有和安全,这是OO编程所希望的良好做法。
封装/数据隐藏不是真的与函数有关吗?
var A = (function(){
var func1 = function(param){
// do stuff
},
publik;
publik.retFunc(){
return func1;
}
return publik;
}())
A.retFunc()(arg1);
答案 0 :(得分:6)
我真的不确定你要去哪里...
但是,为了促进事业:
var Class = (function () {
var private_data = 1234,
private_method = function (x) { private_data += x; },
public_method = function (x) { private_method(x); },
other_method = function () { return private_data; },
public_interface = {
add : public_method,
toString : other_method
};
return public_interface;
}());
我现在已编程到界面
此特定界面为.add
和.toString
。
私人价值观不会被篡改,因为它们已被封闭
只要add
未被修改,private_method
就可以访问add
。
看看,如果你尝试做这样的事情,事后:
Class.add = function (x) { steal(private_data + x); };
它不会起作用。
新功能没有对私有数据的引用。
因此,虽然外部人员或程序可能会篡改公共界面,但内部状态仍然正常。
如果程序被篡改,你的程序可能仍然会破坏,或者其他受保护程度较低的类可能会受到损害,但是这个程序会很愉快,并且需要进行任何内部调用(如果它更新了屏幕,计时器),仍然会完美地发生。
封装的另一个方面是选择要向人们展示的界面。
您可以在一个类中拥有30个辅助函数,但您可能只想让外部应用程序访问其中的一些函数。
而这些公共方法将可以访问私有数据/方法,并能够执行您希望客户端能够执行的任何操作,仅此而已。
这是一个应用程序编程接口。
如果我想要BlogManager
课,那可能会很大
也许我希望它能够从数据库中获取内容,排序,设置模板或与视图进行通信......我希望它能够过滤,我希望它能够做各种各样的事情。 ..
但我不希望最终用户完成所有这些
我希望最终用户执行的操作是.request(options);
或.create(blog_post);
或.update(blog_post);
或.delete(blog_post);
。
如果我向最终用户提供这四种方法,那么没有人可以触摸BlogManager内部的许多其他内容,以使一切按预期工作。
这是对界面的编程。
将来,当我找到一种更好的方法来过滤我的结果,或者当我更改数据库时,或者当我更改数据存储的结构时,我在做什么都不重要在我班上,因为外面看起来和行为一样 如果它有相同的公共方法,相同的输入类型,相同的返回类型......那么你可以在里面做任何你想做的事。
然而,返回 实际 构造函数而不是一个instated对象的情况并不是很多。
就像没有很多返回函数的情况一样,而不是函数的返回值 除了异步编程。