与this question相似但不同。以下代码来自JavaScript: The Definitive Guide。他基本上定义了一个继承方法,如果它存在,则遵循Object.create,否则使用构造函数和交换原型进行普通的旧Javascript继承。
我的问题是,由于在很多常见的浏览器 IE上都不存在Object.create,甚至尝试使用它有什么意义呢?它肯定会使代码混乱,上一个问题的一位评论者提到了Object.create isn't too fast。
那么尝试添加额外代码以便偶尔使用这个ECMA 5函数有什么优势呢?这个函数可能会或可能不会比“旧”这样做慢?
function inherit(p) {
if (Object.create) // If Object.create() is defined...
return Object.create(p); // then just use it.
function f() {}; // Define a dummy constructor function.
f.prototype = p; // Set its prototype property to p.
return new f(); // Use f() to create an "heir" of p.
}
答案 0 :(得分:9)
速度差异不是很明显,因为从本质上说你可能不会创造太多的物体(数百甚至数千不是我所说的很多),如果你和速度是一个关键问题你可能不会在JS中编码,如果上述两种情况都不正确,那么我确信在所有流行的JS引擎的几个版本中,差异可以忽略不计(某些情况已经是这种情况)。 / p>
在回答您的问题时,原因与速度无关,而是因为Object.create
的设计模式受旧方法的青睐(原因如下所述)其他答案)。它们允许正确使用ES5属性属性(这样可以实现更具伸缩性的对象,从而实现更具伸缩性的应用程序),并且可以帮助继承层次结构。
这是前瞻性工程。如果我们采取“好吧,它没有在任何地方实施,所以让我们的脚不湿”,事情会变得非常缓慢。相反,早期和雄心勃勃的采用有助于行业向前发展,帮助业务决策者支持新技术,帮助开发人员改进和完善新想法和支持框架。我是早期(但预防性和后向兼容)采用的倡导者,因为经验表明等待足够的人来支持技术可能会让你等待太久。对于那些不这么认为的人来说,IE6可能是一个教训。