使用Object.create扩展本机JavaScript对象

时间:2015-04-04 03:17:35

标签: javascript

我一直在Mozilla开发者网络上阅读Inheritance and the prototype chain并且一直在想它所说的话。

  

经常使用的一个错误功能是扩展Object.prototype或其他内置原型之一。

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

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

但是假设有人创建了一个新数组并希望它通过其原型链具有Array的所有功能,并且他们做了类似这样的事情:

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

这种扩展(继承)本机对象的方法是否也被视为不良做法?如果是这样,会导致什么问题?

1 个答案:

答案 0 :(得分:1)

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

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

更好的做同样事情的方法,不是通过继承扩展,而是通过组合扩展。

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

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