javascript - 使用 Object.create 扩展原生 JavaScript 对象

标签 javascript

我一直在阅读 Inheritance and the prototype chain在 Mozilla 开发者网络上,并且一直想知道它说了什么。

One mis-feature that is often used is to extend Object.prototype or one of the other built-in prototypes.

我理解为什么在原生对象的原型(prototype)上添加新函数会导致问题。

Array.prototype.first = function() { return this[0]; };

但假设有人创建了一个新数组并希望它通过其原型(prototype)链具有 Array 的所有功能,他们做了如下事情:

function MyArray() { Array.apply(this, arguments); }
MyArray.prototype = Object.create(Array.prototype);
MyArray.prototype.first = function() { return this[0]; };

这种扩展(继承自)原生对象的方法是否也被认为是不好的做法?如果是这样,会造成什么问题?

最佳答案

这是一个一般性的软件架构问题,所以对于什么是对的,什么是错的,会有很多不同的观点。

我的观点是原生对象应该保留原生对象。如果我是一个局外人,看着一个修改了本地对象的代码库,我会很困惑。我可以成为 JavaScript 大师,但一开始我会迷茫和困惑。

做完全相同事情的更好方法是通过组合进行扩展,而不是通过继承进行扩展。

function ListClass() {
  var arr = [];
  return {
     first: function() { return arr[0]; },
     get: function(i) { return arr[i]; },
     push: arr.push 
  };
}

你的想法是完全有效的javascript。唯一的反对意见是代码清晰度。

关于javascript - 使用 Object.create 扩展原生 JavaScript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29442352/

相关文章:

javascript - 如何操作音频标签的内容并从中创建衍生音频标签?

javascript - VueJs 和 vue-i18n 错误

javascript - 如何在javascript中获取小数点后的前2个非零数字

javascript - 指令内的随机 ng-show

javascript - 如何获得准确长度的输入?

javascript - 单击按钮时使 DIV 移动到页面的 Angular 落

javascript - JS 和 CSS 菜单停止在 webgl 页面上工作

javascript - 使用淡入和延迟以及 ng-repeat 来显示列表项

javascript - meteor (0.9.0.1) : Using Helper with autoform to update a record for multiple users

javascript - 从上传的 csv 数据创建数据表列定义