- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我看了a talk by Douglas Crockford on the good parts in Javascript和我的眼睛被打开。有一次他说,“Javascript 是唯一一种优秀的程序员认为他们可以有效使用它而无需学习的语言。”然后我意识到,我就是那个人。
在那次演讲中,他发表了一些对我来说非常令人惊讶和有见地的陈述。例如,JavaScript 是地球上最重要的编程语言。或者它是地球上最流行的语言。而且,它以许多严重的方式被破坏。
对我来说,他最令人惊讶的一句话是“新的是危险的”。他不再使用它了。他也不使用this
。
他为 Javascript 中的构造函数提出了一个有趣的模式,该模式允许私有(private)和公共(public)成员变量,并且既不依赖于 new
也不依赖于 this
。它看起来像这样:
// neo-classical constructor
var container = function(initialParam) {
var instance = {}; // empty object
// private members
var privateField_Value = 0;
var privateField_Name = "default";
var privateMethod_M1 = function (a,b,c) {
// arbitrary
};
// initialParam is optional
if (typeof initialParam !== "undefined") {
privateField_Name= initialParam;
}
// public members
instance.publicMethod = function(a, b, c) {
// because of closures,
// can call private methods or
// access private fields here.
};
instance.setValue = function(v) {
privateField_Value = v;
};
instance.toString = function(){
return "container(v='" + privateField_Value + "', n='" + privateField_Name + "')";
};
return instance;
}
// usage
var a = container("Wallaby");
WScript.echo(a.toString());
a.setValue(42);
WScript.echo(a.toString());
var b = container();
WScript.echo(b.toString());
编辑:更新代码以切换到小写类名。
这个模式是从Crockford's earlier usage models演变而来的.
问题:您使用这种构造函数模式吗?你觉得可以理解吗?你有更好的吗?
最佳答案
这看起来像是 module pattern 的非单例版本,从而可以通过利用 JavaScript 的“闭包”来模拟私有(private)变量。
我喜欢它(有点……)。但我并没有真正看到以这种方式处理私有(private)变量的优势,尤其是当这意味着添加的任何新方法(在初始化之后)都无法访问私有(private)变量时。
另外,它没有利用 JavaScript 的原型(prototype)模型。每次调用构造函数时都必须初始化所有方法和属性——如果您将方法存储在构造函数的原型(prototype)中,则不会发生这种情况。事实上,使用传统的构造函数/原型(prototype)模式要快得多!您真的认为私有(private)变量值得性能损失吗?
这种模型对模块模式有意义,因为它只被初始化一次(以创建一个伪单例),但我不太确定它在这里是否有意义。
Do you use this kind of constructor pattern?
不,虽然我确实使用它的单例变体,但模块模式...
Do you find it understandable?
是的,它是可读的并且非常清晰,但我不喜欢将所有内容都集中在这样的构造函数中的想法。
Do you have a better one?
如果你真的需要私有(private)变量,那么一定要坚持使用它。否则,只需使用传统的构造函数/原型(prototype)模式(除非你和 Crockford 一样害怕 new
/this
组合):
function Constructor(foo) {
this.foo = foo;
// ...
}
Constructor.prototype.method = function() { };
其他与 Doug 对该主题的看法相关的类似问题:
关于javascript - OO Javascript 构造函数模式 : neo-classical vs prototypal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1809914/
我相信 OO,但不至于应该使用不适当的设计/实现来实现“OO 兼容”。 那么,如何应对 Serlvet/EJB/DataContainer 分层架构: Servlet 接收请求并调用“业务层”(例如
我有一个员工分为两类(国内和国际)。我还有一个类Refund,是用来给员工退款的。我有一个名为银行账户的类,由 Refund 类用于退款。 现在我的直接设计是这样的: 员工界面,分国内和国际2个子类型
为什么基于类的 OO 而不是基于原型(prototype)的 OO 如此受欢迎?他们在学校教后者吗?尽管 Javascript 是基于原型(prototype)的,但大多数人主要在功能上使用它,或者通
为什么基于类的 OO 而不是基于原型(prototype)的 OO 如此受欢迎?他们在学校教后者吗?尽管 Javascript 是基于原型(prototype)的,但大多数人主要在功能上使用它,或者通
我找不到主要区别。我很困惑什么时候可以使用继承,什么时候可以使用子类型。我找到了一些定义,但它们不是很清楚。 在面向对象编程中,子类型化和继承有什么区别? 最佳答案 除了已经给出的答案,这里还有一个
我想在类中动态定义方法。我正在写一个跟踪器,比下面的框架稍微复杂一些,它也有状态意识,但这与我的问题无关。我写了一个 TraceSlave 类,它带有调用 sprintf 的跟踪方法,用文本\n 替换
如果你看过Going Deep shows of the Channel9最近,一个经常被提及的话题是mathematical duality在编程中。 TomasP 有一个不错的blog post关
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我是软件设计原则的忠实粉丝,例如 固体 和 干 .面向对象软件设计还有哪些其他原则? 笔记。我不是在寻找诸如“评论您的代码”之类的答案,而是在寻找 OO 设计原则,例如 Uncle Bob 讨论的那些
我找不到主要区别。我很困惑什么时候可以使用继承,什么时候可以使用子类型。我找到了一些定义,但它们不是很清楚。 面向对象编程中的子类型和继承有什么区别? 最佳答案 除了已经给出的答案,这里还有一个 li
这个问题已经有答案了: Javascript: Do I need to put this.var for every variable in an object? (6 个回答) 已关闭 9 年前。
我正在构建一个应用程序,该应用程序在一个对象内有一个对象数组,而它的自身位于一个数组中。我希望能够从子对象访问父对象的属性。我知道我可以简单地通过索引引用父级,如下所示: var parents =
我有一个像这样的html页面 和 2 个像这样的 JavaScript 文件 /// /// /// $(document).ready(fu
我正在尝试用 javascript 做一个巨大的 Web 应用程序,如果我不想搞乱一切,我想我必须以面向对象的方式来做。因此,我进行了很多搜索,发现了很多在 JS 中声明类和创建实例的不同方法,例如环
我在理解 OO 模式如何工作时遇到了一些问题,我的讲师给了我以下问题,但我思考了一整天后无法解决它 我的问题的场景。 有一个名为“ShapeManager”的类,用于管理 Shape 对象。名为“Sh
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 1年前关闭。 Improve this
我正在阅读科学 paper关于 Robert martin 编写的 OO Design Quality Metrics。 在他的论文中,他描述了“一组指标,可用于衡量面向对象设计的质量,根据该设计的子
我有一个与 OOP 相关的问题。我有一个界面,说: class MyInterface { public int getValue(); } 在我的项目中,这个接口(interface)由 7
是否有更好的Pythonic/面向对象方法来选择在运行时执行哪个特定类方法,具体取决于对象的类型,因为使用 type() 方法不被认为优雅(?) 我为我正在使用的三种数据类型编写了以下代码。它基本上将
就 Perl OO 而言,-> 到底做了什么? 例如我打了一个主电话: $result = a::b->mymethod( ); 在我定义 mymethod() 的包中,我使用了以下内容: m
我是一名优秀的程序员,十分优秀!