- 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/
我想知道是否有人可以帮助我,因为我对我认为导致简单错误的简单原因视而不见。 我有这个代码: doRound1(x1) denom1 = 5 y1 = denom1 - x1 mod deno
我有以下代码,注释详细说明了会发生什么: averageNum = myArray2(0) 'assign variable response.write(TypeName(averageNum)&"
我有以下脚本,它在本地运行良好(Windows 10 IIS、Windows 2003 Server),但不适用于我们的托管服务器(Windows 2003 Server)。任何超过 4mb 的下载都
ASP Classic 是否具有等同于 PHP 的“包含一次”功能的功能? 最佳答案 我知道这是一个古老的话题,但我想如果有人感兴趣,我会加上我的两分钱。 我编写了一个函数,它完全符合您的要求:无论调
我在Windows 7中运行IIS 7.5,并且已经进入“打开或关闭Windows功能”并在“Internet信息服务/万维网服务/应用程序开发功能”中启用了ASP。一旦做完,我开始收到一个HTTP
我正在尝试从 MS Access 数据库创建一个 ID(主键和自动增量)以用作登录密码。但我收到此错误: Microsoft OLE DB Provider for ODBC Drivers erro
我已经为 Classic ASP(VBScript) + firephp 编写了一个开源调试类,想知道是否可以获取传递给函数的变量的名称?我进行了搜索,但似乎找不到任何技巧来执行此操作。 例子 代码:
我正在尝试从 MS Access 数据库中创建一个 ID(主键和自动增量)以用作登录密码。但是我收到了这个错误: Microsoft OLE DB Provider for ODBC Drivers
我有一个结帐表格,其中产品的数量可以是“n”。那么我如何知道表单中有多少输入字段并从中获取输入呢? 谢谢 最佳答案 如果它是一组单个控件 - 比如说代表项目的可变数量的复选框 - 解决方案非常简单。对
我刚刚审查了一些旧代码并发现了以下内容(在 foo.asp 中): Const ASP_FILENAME = "foo.asp" ' TODO: Update this to the name of
关注 my last question有谁知道如何在经典 ASP 的应用程序范围内使用字典对象?您不能使用 Scripting.Dictionary - 如果您尝试使用,您将看到类似以下内容: App
我的意思是,像 php'h 包括... 就像是 my_file_to_be_included = "include_me.asp" --> 就我目前所见,有几种选择,但每一种都有某种缺点......
我在哪里可以找到“经典”ASP 代码的编辑器? 最佳答案 如果我要进行大量更改,我总是使用 VS2008(支持智能感知、高亮显示和来自 SP1 的调试),Notepad2对于快速(没有智能感知,只有突
例如,我如何运行下面的 me.test? myvar = 'test' me.myvar ASP 查找方法“myvar”但没有找到。在 PHP 中我可以简单地说 $me->$myvar 但 ASP 的
这是要点: 我有一个我想用asp打的电话,我不关心响应。我只想触发调用,我不希望页面等待响应。根据文档,它应该看起来像这样: dim xmlhttp : set xmlhttp = Server.Cr
示例代码: Dim myObject Set myObject = JSON.parse(someJsonResponseFromTheServer) myFunction(myObject.s
据我所知,VBScript/Classic ASP 中唯一的预处理指令是#include。我不知道这是否是正式名称,但我基本上是在寻找可以在通用 VBScript 之前执行代码或其他指令的代码。 VB
据我所知,VBScript/Classic ASP 中唯一的预处理指令是#include。我不知道这是否是正式名称,但我基本上是在寻找可以在通用 VBScript 之前执行代码或其他指令的代码。 VB
我必须维护一个 ASP 3.0 网站... 我想保护sql语句。 我可以使用此代码保护的选择语句: set cmd = Server.createObject("adodb.command") cmd
我正在使用 WebMatrix 中托管的经典 ASP Web 应用程序。有没有办法调试托管在 WebMatrix 中的网站? 最佳答案 WebMatrix 通过调试工具提供很少(没有)。您可以 Res
我是一名优秀的程序员,十分优秀!