通过以下问题阅读,我觉得大多数答案都忽略了为什么有些人(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的一些功能非常好(例如,方式String和Number演员); 其他部分(什么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当我需要扩展单个对象时,我会使用效果很好.
| 归档时间: |
|
| 查看次数: |
2061 次 |
| 最近记录: |