我真的不确定你要去哪里......
但是,为了进一步的原因:
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
and .toString
。
私有值不会被篡改,因为它们已被封闭。只要不被修改
add
就可以访问。private_method
add
看,如果你尝试做这样的事情,事后:
Class.add = function (x) { steal(private_data + x); };
这是行不通的。
新函数没有对私有数据的引用。
因此,尽管外部人员或程序可能会篡改公共接口,但内部状态仍然很好。
如果您的程序被篡改,或者其他受保护较少的类可能会受到损害,您的程序可能仍然会中断,但是这个程序会很高兴地坐下来,并且它需要进行任何内部调用(例如,如果它更新了屏幕,在计时器上),仍然会完美地发生。
封装的另一点是选择要呈现给人们的界面。
您可以在一个类中拥有 30 个辅助函数,但您可能只想让外部应用程序访问其中的几个。
这些公共方法将可以访问私有数据/方法,并且能够做任何你希望客户能够做的事情,仅此而已。
那是一个应用程序编程接口。
如果我想BlogManager
上课,那可能会很大。
也许我希望它能够从数据库中获取内容、排序、设置模板或与视图通信……我希望它能够过滤,我希望它能够做各种事情。 ..
但我不希望最终用户做所有这些。
我希望最终用户做的是.request(options);
or .create(blog_post);
or .update(blog_post);
or .delete(blog_post);
。
如果我给最终用户这四种方法,那么没有人可以触及 BlogManager 内部发生的许多其他事情以使一切按预期工作。
那是对接口的编程。
将来,当我想出一种更好的方法来过滤我的结果时,或者当我更改我的数据库时,或者当我更改数据存储的结构时,我在我的内部做什么都无关紧要了类,因为外部的外观和行为仍然相同。
如果它具有相同的公共方法、相同的输入类型、相同的返回类型......那么你可以在里面做任何你想做的事情。
但是,返回实际构造函数而不是 instated 对象 的直接案例并不多。
就像返回函数的情况不多,而不是函数的返回值。
除了异步编程。