Crockford的书,JavaScript:The Good Parts,(第114页)说构造函数应始终给出带有首字母大写字母(即Point)的名称,并且带有首字母大写字母的函数名称只能与构造函数一起使用(其他一切都应该是lowerCase).
这个约定有助于我们避免忘记使用new构造函数的运算符.
他接着说,"更好的应对策略是根本不使用new."
我的问题是,我们如何编程JavaScript而不使用它new?
new Object()和new Array()文字{}和[].new Number(),new Boolean()以及new String()用0,true和''.new RegExp()类似的事情/pattern/.我们如何避免new Date()?
而且,最重要的是,我们如何避免使用new自己的自定义对象?
我看了道格拉斯克罗克福德关于Javascript好的部分的演讲,我的眼睛被打开了.有一次,他说,"Javascript是唯一一种优秀的程序员相信他们可以有效地使用它而不需要学习它的语言." 然后我意识到,我就是那个人.
在那次演讲中,他做了一些声明,对我而言,非常令人惊讶和富有洞察力.例如,JavaScript是地球上最重要的编程语言.或者它是这个星球上最流行的语言.并且,它以许多严肃的方式被打破.
对我来说,他最令人惊讶的声明是"新危险".他不再使用它了.他也this没用.
他为Javascript中的构造函数提供了一个有趣的模式,一个允许私有和公共成员变量的模式,并且既不依赖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 …Run Code Online (Sandbox Code Playgroud) 我认为以下代码将使问题清楚.
// My class
var Class = function() { console.log("Constructor"); };
Class.prototype = { method: function() { console.log("Method");} }
// Creating an instance with new
var object1 = new Class();
object1.method();
console.log("New returned", object1);
// How to write a factory which can't use the new keyword?
function factory(clazz) {
// Assume this function can't see "Class", but only sees its parameter "clazz".
return clazz.call(); // Calls the constructor, but no new object is created
return clazz.new(); // Doesn't work because …Run Code Online (Sandbox Code Playgroud) 我正在阅读John Resig的" Pro Javascript Techniques ",我对一个例子感到困惑.这是代码:
// Create a new user object that accepts an object of properties
function User( properties ) {
// Iterate through the properties of the object, and make sure
// that it's properly scoped (as discussed previously)
for ( var i in properties ) { (function(){
// Create a new getter for the property
this[ "get" + i ] = function() {
return properties[i];
};
// Create a new setter for the property
this[ "set" …Run Code Online (Sandbox Code Playgroud) 我观看了John Resig 在JavaScript库设计演示中的最佳实践 ; 一张幻灯片建议"调整"对象构造函数,以便实例化它自己.
function jQuery(str, con) {
if (window === this) {
return new jQuery(str, con);
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
new jQuery("#foo")随之而来的,变成了jQuery("#foo").
我认为这很有趣,但我没有在我自己的代码中编写类似的构造函数.
过了一会儿,我在这里看了一篇文章.(对不起,我不记得哪个或者我提供了一个链接.我会更新问题,如果我能再次找到它.)其中一条评论说这样做是不好的做法躲避new程序员,但没有详细说明.
我的问题是,上述一般认为好,坏,或无动于衷,为什么?