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

使用Object.create扩展本机JavaScript对象,javascript,Javascript,我一直在阅读Mozilla开发者网络,一直在想它说了些什么 一个经常使用的mis特性是扩展Object.prototype或其他内置原型之一 我理解为什么在本机对象的原型上添加新函数会引起问题 Array.prototype.first = function() { return this[0]; }; 但是,假设有人创建了一个新数组,并希望它通过原型链拥有array的所有功能,他们这样做: function MyArray() { Array.apply(this, arguments);

我一直在阅读Mozilla开发者网络,一直在想它说了些什么

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

你的想法完全正确。唯一的反对意见是代码清晰。

Object.create中缺乏清晰性同样适用于本机对象和非本机对象。我也不喜欢它,但重要的区别是原型链接允许
MyArray.length
,而组合需要重新实现或公开组合属性才能获得
length