Javascript 如果Crockford建议我们将新关键字用于原型继承,为什么他说不要使用它?

Javascript 如果Crockford建议我们将新关键字用于原型继承,为什么他说不要使用它?,javascript,Javascript,我看了一段视频,Crockford告诉我们不要使用new关键字。他说如果我没弄错的话,用Object.create代替。为什么他告诉我们不要使用new,如果他在他写的这篇文章中使用了它来实现原型继承: 我希望他使用Object.create而不是new,如下所示: function object(o) { return Object.create((function() {}).prototype = o); } 那么为什么他仍然使用new?Crockford讨论了new和对象。在中创

我看了一段视频,Crockford告诉我们不要使用
new
关键字。他说如果我没弄错的话,用Object.create代替。为什么他告诉我们不要使用
new
,如果他在他写的这篇文章中使用了它来实现原型继承:

我希望他使用Object.create而不是
new
,如下所示:

function object(o) {
    return Object.create((function() {}).prototype = o);
}

那么为什么他仍然使用
new

Crockford讨论了
new
对象。在中创建
。摘录:

如果调用构造函数时没有
new
前缀,而不是 创建和初始化一个新对象,将损坏 全局对象。没有编译时警告,也没有运行时 警告这是语言的一个不好的部分

在我的实践中,我完全避免使用
new


这是一个很老的问题,但是

当克罗克福德写下这篇文章时,并没有。那是2008年,Object.create充其量只是一个提议(或者说很少在浏览器中实现)

他的最终配方基本上是一种聚填料:

if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        function F() {}
        F.prototype = o;
        return new F();
    };
}

newObject = Object.create(oldObject);
因此,他对
new
的唯一用途是模拟(或模拟)Object.create
必须做的事情


他不建议我们使用它。他展示了一个使用它的polyfill,所以你不必在其他任何地方使用它。

也许他从那篇视频/文章中学到了什么?没有视频/上下文很难知道。可能是a)
对象的组合。创建不跨少数浏览器的
,以及B)几年前写的那篇文章;他的编程风格,像我们大多数人一样,可能从那时起已经发生了变化和演变。以下是视频:(我不知道他在视频中说的确切位置,对不起)另外,在你参考的文章中,他在2008-04-07的增编基本上回答了这个问题,他定义了
对象。如果它不存在,创建
。您只需使用一次
new
(定义
Object.create
)。问题中的代码是您的,还是您在某处找到的?我询问的原因是它的
(function(){}).prototype=
部分对代码没有影响。如果执行
返回Object.create(o),则会得到相同的结果也许我不熟悉所有的javascript攻击,但是为什么有人在没有
new
关键字的情况下调用构造函数?!?Crockford实际上说的是,如果你省略了新的关键字,你将重击全局对象。他建议不使用它的原因是有可能忽略它。它是构造函数对象所必需的。