用Object.create扩展本地JavaScript对象

我一直在阅读Mozilla开发者网络上的继承和原型链,并一直在想它所说的东西。

常常使用的一个错误特性是扩展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]; };

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


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

我的意见是,本地对象应该保持原生对象。 如果我是一个局外人正在修改一个本地对象的代码库,我会很困惑。 我可以成为一名JavaScript大师,但我一开始会迷迷糊糊。

做完全相同的事情的一种更好的方式,不是通过继承延伸,而是通过组合来延伸。

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

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

链接地址: http://www.djcxy.com/p/27241.html

上一篇: Extending native JavaScript objects with Object.create

下一篇: .extend, not prototype for classes?