美好的一天!我有这段代码:
function MyArray() {}
MyArray.prototype.length = 0;
(function() {
var methods = ['push', 'pop', 'shift', 'unshift',
'slice', 'splice', 'join'];
for (var i = 0; i < methods.length; i++) (function(name) {
MyArray.prototype[ name ] = function() {
return Array.prototype[ name ].apply(this, arguments);
};
})(methods[i]);
})();
我需要解释。我明白“方法”是一系列真正的方法,只是“导出”到我们的新类。但是,这是什么:MyArray.prototype.length = 0; ?作者创建新的prototype属性并将其赋值为零。然后使用这个新属性!
var mine = new MyArray();
mine.push(1, 2, 3);
assert(mine.length == 3 ...
.....
它是如何工作的? “长度”在上面的代码中没有实例化!
答案 0 :(得分:3)
它初始化为零,这样如果你从不调用它的任何函数,它将返回零(如真实数组)而不是未定义。此外,它需要从零开始,以便方法正确更新它。在你的例子中,长度为3,因为push方法是这样做的。
答案 1 :(得分:0)
你不能真正继承Array http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/
因此,如果您创建一个MyArray实例,则无法执行此操作:MyArr [0] = ...
您可以将数组包装在MyArray中并利用数组函数:
var MyArray=function() {
this.arr=[];
[].push.apply(this.arr,arguments);
//following doesn't work in older browsers
Object.defineProperty(this,"length",{
get:function(){return this.arr.length;},
enumerable:true,
configurable:true
});
}
MyArray.prototype.valueOf=function(){return this.arr;};
(function() {
var methods = ['push', 'pop', 'shift', 'unshift',
'slice', 'splice', 'join'],i=methods.length
while(--i!==-1){
;(function(name) {
MyArray.prototype[ name ] = function() {
console.log(arguments);
return Array.prototype[ name ].apply(this.arr, arguments);
};
}(methods[i]));
}
}());
var mArr1=new MyArray(1,2,3);
console.log(mArr1.slice(0,1));
//you cannot do this: myArr1[0]=22;