2013-11-27 92 views
1

美好的一天!我有这个代码:模拟阵列功能

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; ?作者创建新的原型属性并将其赋值为零。然后使用这个新的属性!

var mine = new MyArray(); 
mine.push(1, 2, 3); 
assert(mine.length == 3 ... 
..... 

它是如何工作的? “长度”没有在上面的代码中实例化!

+0

*你是什么意思*实例化*?你可以实例化对象,但这只是一个原始的... – Kiruse

+0

对不起,我的意思是实现。 “长度”属性没有任何实现。只分配一个零。 – user2972298

+0

'length'在方法内部使用。它是数组派生的正确功能所必需的。尝试删除声明,看看会发生什么。你可能会得到一个错误,或者可能是不可预知的行为。 – Kiruse

回答

0

你真的不能子阵列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; 
3

它被初始化为零,所以如果你从不调用它的任何函数,它将返回零(像一个真正的数组),而不是未定义的。还需要从零开始,以便方法正确更新。在你的例子中,长度是3,因为push方法是这样做的。

+0

好的。但是“长度”不在导出方法的数组中。 “长度”实现在哪里? – user2972298

+0

什么是实现?它在第一行中初始化(MyArray.prototype.length = 0;)。长度是'财产'而不是'方法'。 –