我一直在阅读 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/