10

类似于,但不同于这个问题。下面的代码来自JavaScript: The Definitive Guide。他基本上是在定义一个继承方法,如果 Object.create 存在,则该方法遵循它,否则使用构造函数和交换原型进行普通的旧 Javascript 继承。

我的问题是,既然 Object.create 在很多常见的浏览器IE上都不存在,那么尝试使用它有什么意义呢?它肯定会使代码混乱,上一个问题的评论者之一提到 Object.create不是太快

那么,尝试添加额外代码以偶尔利用这个可能会或可能不会比“旧”执行此操作的方式慢的 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.
}
4

1 回答 1

9

速度差异不是很明显,因为从本质上讲,您可能不会创建太多对象(数百,甚至数千不是我所说的很多),如果您是并且速度是一个关键问题,您可能不会不要在 JS 中编码,如果以上两种情况都不正确,那么我敢肯定,在所有流行的 JS 引擎的几个版本中,差异将可以忽略不计(在某些情况下已经如此)。

在回答您的问题时,原因与速度无关,而是因为设计模式偏向Object.create于旧方法(出于该和其他答案中概述的原因)。它们允许正确利用 ES5 属性(这使得对象更具可扩展性,因此应用程序也更具可扩展性),并且有助于继承层次结构。

是正向工程。如果我们采取“好吧,它并没有在所有地方实施,所以我们不要弄湿我们的脚”的路线,事情会进展得很慢。相反,早期和雄心勃勃的采用有助于行业向前发展,帮助业务决策者支持新技术,帮助开发人员改进和完善新想法和支持框架。我是早期(但预防性且仍然向后兼容)采用的倡导者,因为经验表明,等待足够多的人来支持一项技术可能会让您等待太久。愿 IE6 给那些不以为然的人上一课。

于 2011-09-21T21:50:22.240 回答