自定义数组函数使用原型。新的MyArray(1,2,3,4)无效

时间:2014-12-14 12:01:56

标签: javascript arrays

我需要的是一个自定义函数来充当本机Array对象。当我创建一个对象时,它应该像new Array(1,2,3,4)一样。它应该创建一个元素数组。

<script type="text/javascript">

function MyArray(){

}

MyArray.prototype=Array.prototype;

var collection = new MyArray(1, 2, 3, 4);


console.log(collection);


// My code should act like. 

var coll= new Array(1,2,3,4);

console.log(coll);

</script>

3 个答案:

答案 0 :(得分:3)

您可以通过检查构造函数中的参数来初始化MyArray实例,并在适用的情况下推送它们。您可能会问自己是否真的需要一个自定义MyArray构造函数来模仿Array。当您需要自定义方法时,扩展Array.prototype可能是更好的选择。随附的片段也证明了这一点。

function MyArray() { 
  if (arguments.length) {
    [].push.apply(this, arguments);
  }
}
MyArray.prototype = new Array;

var resultdiv = document.querySelector('#result');


// create new instance of MyArray
var foo = new MyArray(1, 2, 3, 4, 5, 6);

// downside: you can't do this
foo[foo.length] = 7;

// use MyArray for reporting
var report = new MyArray('<code>foo length: ', 
                          foo.length,
                         ', foo: [',
                          foo, 
                         ']<br><b>@abforce</b>: ',
                         'foo.hasOwnProperty(\'length\') =&gt; ',
                          foo.hasOwnProperty('length'),
                         '</code>');

resultdiv.innerHTML = report.join('');

// alternative: adding custom methods to Array.prototype
Array.prototype.lastItem = function () {
  return this[this.length-1];
};

var bar = [1,2,3,4,5,6];

// now you can
bar[bar.length] = 7;

resultdiv.innerHTML += ['<br><code>bar last item: ',
                        bar.lastItem(),
                       '</code>'].join('');
<div id="result"></div>

答案 1 :(得分:0)

您可以在构造函数

中返回数组的实例
function MyArray(){
    return new Array();
}

请注意,在这种情况下,因为构造函数显式返回一个对象,因此隐式返回 this will be ignored

但在这种情况下,返回的对象跟随MyArray.prototype,它将链接到Array.prototype

答案 2 :(得分:0)

它的工作。

function MyArray() {
  var arr = [ ];
  arr.push.apply(arr, arguments);
  arr.__proto__ = MyArray.prototype;
  return arr;
}

MyArray.prototype = new Array;

// Add custom functions here to MyArray.prototype.
MyArray.prototype.last = function() {
  return this[this.length - 1];
};

var sub = new MyArray(1, 2, 3);


console.log(sub);
</script>