【问题标题】:Advantage of using Object.create使用 Object.create 的优势
【发布时间】:2011-11-22 06:18:12
【问题描述】:

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

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

【问题讨论】:

    标签: javascript javascript-objects ecmascript-5 object-create


    【解决方案1】:

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

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

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

    【讨论】:

    • 这是一个非常有用的答案;我明白为什么 create 更可取,因为它使您可以对所创建对象的属性进行大量控制。我明白你为什么要说var bob = Object.create(userB, { "id": { value: 12, enumerable: false 等等,但是这段代码不会在IE9 及以下版本中剧烈崩溃吗?这样的代码不会仅限于(美妙的)您可以控制用户正在使用的浏览器的情况吗?
    • 换句话说,在 IE8 中,我不仅要通过使用旧的 JS 交换原型方法来获得我的新继承方法,而且我还必须更改对象传入作为从 userB 继承的“子”对象。而不是{ "id": { value: 12, enumerable: false 我不需要{ "id" : 12, "name": "bob" 等等吗?
    • @AdamRackis,没错,代码原样不向后兼容,但我敢肯定有项目试图简化这些事情。如果没有,这是个好主意。自动化这些更改并不难。
    • 确实 - 我确信通过对象并将其映射到 ECMA3 兼容对象上并不需要太多时间。感谢您花时间回答这个问题。你真的帮它点击了。我只是用 Q 是更高的流量,所以你可以得到更多的 $$
    猜你喜欢
    • 1970-01-01
    • 2019-06-07
    • 2014-11-09
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2011-03-27
    相关资源
    最近更新 更多