gpt4 book ai didi

javascript - 函数的封装 |面向对象的目的

转载 作者:行者123 更新时间:2023-11-30 08:09:13 24 4
gpt4 key购买 nike

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

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

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

下面的代码是否像面向对象编程的良好实践所希望的那样使 func1 保持私有(private)和安全。

或者封装/数据隐藏与函数无关?

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

A.retFunc()(arg1);

最佳答案

我真的不确定你要用这个去哪里......
但是,为了进一步插入事业:

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

我现在已经编程到一个接口(interface)。
这个特定的接口(interface)将是 .add.toString

私有(private)值不会被篡改,因为它们已被封装。
只要 add 未被修改,add 就有能力访问 private_method

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

Class.add = function (x) { steal(private_data + x); };

这是行不通的。
新函数没有对私有(private)数据的引用。

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

如果您的程序被篡改,或者其他 protected 较少的类可能会受到损害,您的程序可能仍会中断,但是这个程序会很高兴,并且它需要进行任何内部调用(比如它更新屏幕,在定时器),仍然会完美地发生。

封装的另一点是选择要呈现给人们的界面。

你可以在一个类中有 30 个辅助函数,但你可能只想让外部应用程序访问其中的几个。
这些公共(public)方法将可以访问私有(private)数据/方法,并且能够执行您希望客户能够执行的任何操作,仅此而已。

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

如果我想要一个 BlogManager 类,它可能会很大。
也许我希望它能够从数据库中获取内容、进行排序、设置模板或与 View 进行通信……我希望它能够进行过滤,我希望它能够执行各种操作。 ..

但我不希望最终用户做所有这些。
我希望最终用户做的是 .request(options);.create(blog_post);.update(blog_post);.delete(blog_post);.

如果我为最终用户提供这四种方法,那么没有人可以触及 BlogManager 内部发生的许多其他事情,以使一切按预期工作。
那是针对接口(interface)的编程。

将来,当我想出更好的方法来过滤结果时,或者当我更改数据库时,或者当我更改数据存储结构时,我在在我的类(class)里面,因为外面看起来和行为仍然一样。
如果它具有相同的公共(public)方法、相同的输入类型、相同的返回类型... ...那么您可以在里面做任何您想做的事情。

不过,返回实际 构造函数而不是一个已声明的对象的情况并不多。

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

关于javascript - 函数的封装 |面向对象的目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12861123/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com