封装功能|就OO而言的目的

时间:2012-10-12 14:21:57

标签: javascript

封装是OO编程的核心内容。

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

我想不会,那是b.c.如果你返回一个函数,你没有返回它的副本...你正在返回一个引用。这是问题的核心。返回函数时,它是副本还是对实际函数的引用。

下面的代码是否保持func1私有和安全,这是OO编程所希望的良好做法。

封装/数据隐藏不是真的与函数有关吗?

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

A.retFunc()(arg1);

1 个答案:

答案 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对象的情况并不是很多。

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