JavaScript的"新"关键字是否被视为有害(第2部分)?

Ste*_*eve 12 javascript

通过以下问题阅读,我觉得大多数答案都忽略了为什么有些人(Crockford)选择不使用"新"关键字.这不是为了防止在没有"new"关键字的情况下意外调用函数.

根据Crockford关于原型继承的以下文章,他实现了一种对象创建技术,该技术更清楚地展示了JS的原型性质.现在甚至在JS 1.8.5中实现了这种技术.

他反对使用新的论点可以更清楚地概括为:

"这种间接性旨在使语言对经过专业训练的程序员来说更加熟悉,但却没有做到这一点,正如我们从Java程序员对JavaScript的非常低级的看法中看到的那样.JavaScript的构造函数模式并不适合经典人群.也模糊了JavaScript真正的原型性质.因此,很少有程序员知道如何有效地使用这种语言."

我并不一定认为"新"有害,但我确实认为它"掩盖了JavaScript真正的原型性质",因此我在这一点上必须同意Crockford.

您对使用"更清晰"的原型对象创建技术,而不是使用"new"关键字有什么看法?

Ray*_*nos 13

你是对的,使用new被认为是有害的,因为它没有足够强调JavaScript是典型的OO.主要问题是,行为太像经典类,人们不应该考虑class.人们应该考虑对象并使用现有对象创建新对象作为蓝图.

new 是JavaScript接受Java语法以获得"流行度"的日子的残余.

这些天我们Object.create使用ES5垫片进行Prototypical OO .

不再需要new了.

在ES5普遍实施之前(只有FF3.6和IE8松弛),我们使用了new因为我们别无选择.someFunction.prototype是原型继承的方式.

我最近写了一个"很好"的演示,Object.create尽管我仍然需要解决一些问题.重要的是将对象与工厂功能分开.


T.J*_*der 10

我没有发现这new对我来说掩盖了语言的原型本质.我已经花了几年时间才能很好地了解这门语言(最初的错误就是潜入并开始编写代码,而不知道语言实际上是如何工作的,这是我的初始成本).

我发现new表达方式在函数名称前面加上"new"或使用辅助函数等,不是:

var fido      = new Dog();          // Simple, clear
var rover     = Dog();              // Very unclear (fortunately people mostly don't do this, but I've seen it)
var scruffles = newDog();           // Clearer, but hacky
var fifi      = Object.create(Dog); // (Crockford) Verbose, awkward, not esp. clear
Run Code Online (Sandbox Code Playgroud)

无论是原型还是基于类(并且大多数都与new关键字完全无关),我仍然认为最好将功能组合在一起构建块(对象或类或其他),然后是特定的对象我可以捣乱关于不影响那些积木.对我来说,new作为一种清楚地表明我的意图的手段既不是优雅的,也不是典型的,它很明显.

对我来说,newJavaScript和原型本身一样重要,因为它们具有奇妙的灵巧功能.这是没有冲突的.

和口语实践,有很多更程序员,习惯使用new创建的东西比没有新的实例,它是在JavaScript社会一种普遍的做法,尽管Crockford的努力(别误会,我有很多的克罗克福德的尊重).如果我正在组建一个项目,我不希望再培训麻烦.

这并不是说你在JavaScript中定义原型对象的层次结构的方式永远是美丽和快乐的事情.这是一种皇家的痛苦,尤其是没有ECMAScript5增强功能.但是定义一个辅助函数来帮助你连接你的层次结构(无论你想叫它们),你就完成了.(见下面的更新.)

[是的,被称为关于构造函数整个事情没有new真正的是一个红色的鲱鱼(你没有说你不认为这是一个要点其一).你几乎从未在现实世界中看到它.实际上,JavaScript的一些功能非常好(例如,方式StringNumber演员); 其他部分(什么Date**不寒而栗**)不那么好看...]


从ES2015(ES6)开始,由于新的类语法,创建原型和构造函数的层次结构变得轻而易举.不再需要助手了.

class Base {
    constructor(name) {
        this.name = name;
    }
    greeting() {
        return "Hi, I'm " + this.name;
    }
}

class Derived extends Base {
    constructor(name, age) {
        super(name);
        this.age = age;
    }
    greeting() {
        return super.greeting() + " and I'm " + this.age + " years old";
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,这并不意味着我们想要它们.Object.create当我需要扩展单个对象时,我会使用效果很好.

  • @TJ哈哈...... nu是新的"新" (4认同)