- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
封装是面向对象编程的核心原则。
但是,如果您将一个函数设为私有(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/
我需要使用封装打印3个变量,并且无法修改主类。 主类声明变量[汽缸、制造商、所有者],并希望使用如下参数创建和打印一个对象: System.out.println (new Vehicle (cyli
我正在研究“Beginning Ruby”这本书,在我进行封装之前一切都进行得很顺利。我明白这段代码在做什么,我只是不知道为什么要用这些方法设置它。 对于那些感兴趣的人 this is the lin
所以我一直在研究面向对象的完整开发 JavaScript 实践,并对以下示例感到好奇。 据我了解,(这对我来说很有意义)以下“ secret ”字段是“私有(private)”的: var MyObj
在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装、隐藏起来的方法。 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代
封装 被定义为 把一个或多个项目封闭在一个物理的或者逻辑的包中 。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。 抽象和封装是面向对象程序设计的相关特性。抽象允许相关信息可
今天我读了一本书,作者写道,在一个设计良好的类中,访问属性的唯一方法是通过其中一个类方法。这是一个被广泛接受的想法吗?为什么封装属性如此重要?不做会有什么后果?我早些时候在某处读到这可以提高安全性或类
今天我接受了软件工程职位的面试。我已经从 stackoverflow 中阅读了很多关于面试的内容。他们向我询问了与 OOP 相关的正常情况。但他们也问我这些: 没有继承就可以封装吗? 没有继承就可以抽
我正在制作一个简单的网站,并编写了gradle构建脚本,该脚本将执行诸如lint并最小化css / html / js之类的事情。 在这一阶段,我刚刚完成了正在运行的CSS,但是只是初始的非结构化格式
下面的幻灯片是指 C++ 语言,它说 "encapsulation is about ensuring the user uses our ADT in a safe way" 但是,如果他可以访问我
尝试设置一个 Person 类 我在尝试将信息封装在类中以使其不会被意外更改时遇到了问题。除了当我尝试使用 setter/getters 进行封装时,该类工作得非常好。我认为问题是这些方法最终会互相循
面向对象的概念:封装、数据抽象和数据隐藏是3个不同的概念,但彼此之间非常相关。所以我很难通过阅读互联网上的信息来完全理解这些概念。一个地方可用的信息与互联网上另一个地方的信息相矛盾。有人可以指导我阅读
我被封装困住了。在我看来,好像我已经按照规则做了一切,但仍然不起作用。虽然我知道我错过了一些东西。我正在使用 Eclipse。 我想要通过创建一副标准 52 张卡片来进行一些练习,并尝试我学到的新东西
在java中,要获取映射中的所有键,我们可以使用方法keySet。但我想知道为什么方法名称不只是 keys ?名称 Set 是否会泄露有关实现的详细信息? 据我了解,Java 是静态类型语言,名称中包
我正在尝试找出如何防止应用程序中的页面变量被全局定义。我想出了一些方法,但我想知道是否有人们使用的通用标准方法。 我使用这种方法得到了我的插件设计模式:http://www.virgentech.co
我有一个 tcp 连接,我想在服务器类的 HandleConnectionAsync 方法中保持打开状态。它将从客户端接收持续更新。 private async void HandleConnecti
这是我类(class)的一个小样本: #include #include using std::string; using std::vector; struct Book { string
我想要类似下面的代码: class Foo{ public: void update() { for( auto dataModifier : _dataModifierLis
这已经困扰我一段时间了,所以我问了一个同事他是否能理解它,现在我来了;) 为什么可以在依赖属性的 PropertyChangedCallback 中访问持有类的私有(private)成员? 让我通过这
我知道封装意味着一个对象不应该直接访问不同对象的成员……但我猜它与公共(public)领域有关?我假设公共(public)方法不会破坏封装..?我只是在这里不清楚,很高兴得到任何解释。 最佳答案
我就废话不多说了,大家还是直接看代码吧~ ? 1
我是一名优秀的程序员,十分优秀!