封装是面向对象编程的核心思想。
但是,如果您将一个函数设为私有,然后返回它以便可以使用它,则可以有效地对任何对象执行此操作。
我可不这么认为公元前。如果你返回一个函数,你返回的不是it...you的副本,而是一个引用。这就是问题的核心。当您返回一个函数时,它是一个副本还是对实际函数的引用。
下面的代码是否像OO编程所希望的那样让func1保持私有和安全。
或者封装/数据隐藏不是真正与函数相关的?
var A = (function(){
var func1 = function(param){
// do stuff
},
publik;
publik.retFunc(){
return func1;
}
return publik;
}())
A.retFunc()(arg1);发布于 2012-10-13 00:41:06
我真的不知道你想说什么..。
但是,为了进一步推动这一事业:
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。
私有值是安全的,不会被篡改,因为它们已经被封闭。
只要不修改private_method,add就可以访问add。
你看,如果你想做这样的事情,事后:
Class.add = function (x) { steal(private_data + x); };这是行不通的。
新函数没有对私有数据的引用。
因此,尽管外部人员或程序可能会篡改公共接口,但内部状态仍然完好无损。
如果你的程序被篡改了,你的程序可能仍然会崩溃,或者其他受保护较少的类可能会被破坏,但这个类将会安然无事,它需要进行的任何内部调用(比如如果它更新了一个屏幕,在计时器上)仍然会完美地发生。
封装的另一个要点是选择您想要呈现给人们的接口。
在一个类中可以有30个辅助函数,但您可能只想让外部应用程序访问其中的一小部分。
这些公共方法将能够访问私有数据/方法,并且能够执行您希望客户端能够执行的任何操作,仅此而已。
这是一个应用程序编程接口。
如果我想要有一个BlogManager类,它可能会很大。
也许我希望它能够从数据库中获取内容,进行排序,设置模板,或者与视图进行通信……我希望它能够过滤,我希望它能做各种事情……
但我不希望最终用户做所有这些事情。
我希望最终用户做的是.request(options);、.create(blog_post);、.update(blog_post);或.delete(blog_post);。
如果我给最终用户提供这四种方法,那么没有人能接触到BlogManager内部正在进行的其他几十件事情,从而使一切都像预期的那样工作。
这就是对接口进行编程。
将来,当我找到一种更好的方法来过滤我的结果时,或者当我改变我的数据库时,或者当我改变数据存储的结构时,我在类内部做什么都不重要了,因为外部看起来和行为都是一样的。
如果它有相同的公共方法,相同的输入类型,相同的返回类型......then你可以在里面做任何你想做的事情。
不过,返回实际的构造函数而不是实例化对象的情况并不多见。
就像没有很多情况下会返回函数,而不是函数的返回值。
除了异步编程。
https://stackoverflow.com/questions/12861123
复制相似问题