在另一个问题中,一个用户指出使用new关键字是危险的,并提出了一个不使用new的对象创建解决方案。我不相信这是真的,主要是因为我使用过Prototype、Script.aculo.us和其他优秀的JavaScript库,它们都使用new关键字。
尽管如此,昨天我在YUI剧院看了Douglas Crockford的演讲,他说了完全相同的事情,他不再在他的代码中使用new关键字(Crockford谈JavaScript -第三幕:函数终极- 50:23分钟)。
使用new关键字“不好”吗?使用它的优点和缺点是什么?
在我看来,在2021年的JavaScript中,“新”是一个有缺陷的概念。它在不需要的地方添加单词。它使函数/构造函数的返回值为隐式,并强制在函数/构造函数中使用此返回值。在代码中添加噪声从来都不是一件好事。
// With new
function Point(x, y) {
this.x = x
this.y = y
}
let point = new Point(0, 0)
Vs.
// Without new
function Point(x, y) {
return { x, y }
}
let point = Point(0, 0)
以下是我对支持和反对使用新运算符的两个最有力的论点所做的最简短的总结:
反对新建的理由
Functions designed to be
instantiated as objects using the
new operator can have disastrous
effects if they are incorrectly
invoked as normal functions. A
function's code in such a case will
be executed in the scope where the
function is called, instead of in
the scope of a local object as
intended. This can cause global
variables and properties to get
overwritten with disastrous
consequences.
Finally, writing function Func(),
and then calling Func.prototype
and adding stuff to it so that you
can call new Func() to construct
your object seems ugly to some
programmers, who would rather use
another style of object inheritance
for architectural and stylistic
reasons.
关于这个争论的更多信息,请参阅Douglas Crockford的著作《JavaScript: The Good Parts》。事实上,还是去看看吧。
赞成新
使用新的运算符
原型赋值很快。
那些关于意外的东西
运行一个构造函数
全局名称空间中的代码可以
很容易预防,如果你总是
包含一些代码在您的
要检查的构造函数
看看它们是否被调用
正确,而且,在这种情况下
他们没有,接听电话
如你所愿。
请参阅John Resig的文章,以获得对这种技术的简单解释,以及对他所倡导的继承模型的一般更深入的解释。
不使用new关键字的理由很简单:
通过根本不使用它,您可以避免意外遗漏它的陷阱。YUI使用的构造模式是一个如何完全避免new关键字的例子:
var foo = function () {
var pub = { };
return pub;
}
var bar = foo();
或者,你可以这样做:
function foo() { }
var bar = new foo();
但是这样做有可能会有人忘记使用new关键字,并且this操作符完全是FUBAR。据我所知,这样做没有任何好处(除了你已经习惯了)。
在一天结束的时候:这是关于防御性的。你会用这个新语句吗?是的。这会让你的代码更危险吗?是的。
如果你曾经写过c++,这类似于在删除指针后将它们设置为NULL。