return m_elements.push.apply(m_elements, arguments)怎么理解
<html> <head> <title>Example-21.14 构造继承法</title> </head> <body> <script> <!-- function dwn(s) { document.write(s + "<br/>"); } //定义一个Collection类型 function Collection(size) { this.size = function(){return size}; //公有方法,可以被继承 } Collection.prototype.isEmpty = function(){ //静态方法,不能被继承 return this.size() == 0; } //定义一个ArrayList类型,它"继承"Collection类型 function ArrayList() { var m_elements = []; //私有成员,不能被继承 m_elements = Array.apply(m_elements, arguments); //ArrayList类型继承Collection this.base = Collection; this.base.call(this, m_elements.length); this.add = function() { return m_elements.push.apply(m_elements, arguments); } this.toArray = function() { return m_elements; } } ArrayList.prototype.toString = function() { return this.toArray().toString(); } //定义一个SortedList类型,它继承ArrayList类型 function SortedList() { //SortedList类型继承ArrayList this.base = ArrayList; this.base.apply(this, arguments); this.sort = function() { var arr = this.toArray(); arr.sort.apply(arr, arguments); } } //构造一个ArrayList var a = new ArrayList(1,2,3); dwn(a); dwn(a.size()); //a从Collection继承了size()方法 dwn(a.isEmpty); //但是a没有继承到isEmpty()方法 //构造一个SortedList var b = new SortedList(3,1,2); b.add(4,0); //b 从ArrayList继承了add()方法 dwn(b.toArray()); //b 从ArrayList继承了toArray()方法 b.sort(); //b 自己实现的sort()方法 dwn(b.toArray()); dwn(b); dwn(b.size()); //b从Collection继承了size()方法 --> </script> </body> </html>
在ArrayList对象的add方法中
return m_elements.push.apply(m_elements, arguments);
这一句怎么理解呢?
这一句不是等于m_elements.push(arguments);吗,为什么还要写的那么罗嗦,
其实这么罗嗦的写目的在于 把Object当Array使用,举个例子:
你有一个对象person,然后你可以调用[].push.apply(person, ["aa", "bb"])
<script>
var person = {};
[].push.apply(person, ["aa"]);
alert(person[0]);
</script>
就会弹出 aa,其实作用的对象是person,但是IE不支持这个写法,firefox和chrome支持
补充一下,IE要想支持这个写法,需要在调用push.apply之前,调用下person.length = 0;,才可以把对象当做数组使用