我一直在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]; };
这种扩展(继承)本机对象的方法是否也被视为不良做法?如果是这样,会导致什么问题?
答案 0 :(得分:1)
这是一个通用的软件架构问题,所以对于什么是对错可以有很多不同的观点。
我的观点是原生对象应该保留原生对象。如果我是一个局外人,看着一个修改了本机对象的代码库,我会很困惑。我可能是一个javascript大师,但我一开始会迷茫和困惑。
更好的做同样事情的方法,不是通过继承扩展,而是通过组合扩展。
function ListClass() {
var arr = [];
return {
first: function() { return arr[0]; },
get: function(i) { return arr[i]; },
push: arr.push
};
}
您的想法是完全有效的JavaScript。唯一的反对意见是代码清晰度。