首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数封装|面向对象方面的用途

函数封装|面向对象方面的用途
EN

Stack Overflow用户
提问于 2012-10-12 22:21:57
回答 1查看 90关注 0票数 1

封装是面向对象编程的核心思想。

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

我可不这么认为公元前。如果你返回一个函数,你返回的不是it...you的副本,而是一个引用。这就是问题的核心。当您返回一个函数时,它是一个副本还是对实际函数的引用。

下面的代码是否像OO编程所希望的那样让func1保持私有和安全。

或者封装/数据隐藏不是真正与函数相关的?

代码语言:javascript
复制
var A = (function(){
    var func1 = function(param){
        // do stuff
        },
        publik;
    publik.retFunc(){
        return func1;
    }
    return publik;
}())

A.retFunc()(arg1);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-13 00:41:06

我真的不知道你想说什么..。

但是,为了进一步推动这一事业:

代码语言:javascript
复制
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_methodadd就可以访问add

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

代码语言:javascript
复制
Class.add = function (x) { steal(private_data + x); };

这是行不通的。

新函数没有对私有数据的引用。

因此,尽管外部人员或程序可能会篡改公共接口,但内部状态仍然完好无损。

如果你的程序被篡改了,你的程序可能仍然会崩溃,或者其他受保护较少的类可能会被破坏,但这个类将会安然无事,它需要进行的任何内部调用(比如如果它更新了一个屏幕,在计时器上)仍然会完美地发生。

封装的另一个要点是选择您想要呈现给人们的接口。

在一个类中可以有30个辅助函数,但您可能只想让外部应用程序访问其中的一小部分。

这些公共方法将能够访问私有数据/方法,并且能够执行您希望客户端能够执行的任何操作,仅此而已。

这是一个应用程序编程接口。

如果我想要有一个BlogManager类,它可能会很大。

也许我希望它能够从数据库中获取内容,进行排序,设置模板,或者与视图进行通信……我希望它能够过滤,我希望它能做各种事情……

但我不希望最终用户做所有这些事情。

我希望最终用户做的是.request(options);.create(blog_post);.update(blog_post);.delete(blog_post);

如果我给最终用户提供这四种方法,那么没有人能接触到BlogManager内部正在进行的其他几十件事情,从而使一切都像预期的那样工作。

这就是对接口进行编程。

将来,当我找到一种更好的方法来过滤我的结果时,或者当我改变我的数据库时,或者当我改变数据存储的结构时,我在类内部做什么都不重要了,因为外部看起来和行为都是一样的。

如果它有相同的公共方法,相同的输入类型,相同的返回类型......then你可以在里面做任何你想做的事情。

不过,返回实际的构造函数而不是实例化对象的情况并不多见。

就像没有很多情况下会返回函数,而不是函数的返回值。

除了异步编程。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12861123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档