1

封装是面向对象编程的核心原则。

但是,如果您将函数设为私有,然后将其返回以便您可以使用它,则可以有效地执行此操作。

我不认为,如果你返回一个函数,那么你不会返回它的副本......你正在返回一个引用。这就是问题的核心。当您返回一个函数时,它是一个副本还是对实际函数的引用。

下面的代码是否保持 func1 的私密性和安全性,就像良好实践 OO 编程所希望的那样。

还是封装/数据隐藏与功能无关?

var A = (function(){
    var func1 = function(param){
        // do stuff
        },
        publik;
    publik.retFunc(){
        return func1;
    }
    return publik;
}())

A.retFunc()(arg1);
4

1 回答 1

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;
}());

我现在已经编程到一个界面。
这个特定的界面是.addand .toString

私有值不会被篡改,因为它们已被封闭。只要不被修改
add就可以访问。private_methodadd

看,如果你尝试做这样的事情,事后:

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 对象 的直接案例并不多。

就像返回函数的情况不多,而不是函数的返回值。
除了异步编程。

于 2012-10-12T16:41:06.173 回答