2014-12-14 3 views
0

Все, что мне нужно, это настраиваемая функция, которая будет действовать как объект Array. Когда я создаю объект, он должен действовать так же, как и new Array(1,2,3,4). Он должен создать массив элементов.Пользовательский массив Функция, использующая прототип. новый MyArray (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> 
+1

Зачем вам нужен 'пользовательская функция, чтобы действовать в качестве родного массива object'? – thefourtheye

+2

Похоже, вы хотели подкласс Array. Не [простая задача] (http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/). – Teemu

+0

Массив подкласса - это решение. –

ответ

0

вы можете вернуть экземпляр массива в функции конструктора

function MyArray(){ 
    return new Array(); 
} 

Обратите внимание, что в этой ситуации, потому что ваша функция конструктора явно возвращает объект, следовательно, неявное возвращение этойwill be ignored.

Но в этом случае возвращаемый объект делает не следовать MyArray.prototype, он будет связан с Array.prototype вместо этого.

+0

его не работает –

+1

@ Explore-X Как уже заявили другие участники, вы не можете создать свой собственный подкласс «Array», и мой код не предоставляет шаблон, в котором вы можете реализовать такую ​​структуру. Просто скажите, вы можете вернуть объекты из своего конструктора, чтобы переопределить неявное возвращение * this * –

+0

HI вы можете проверить, что я ответил на мои поиски. И это правильный способ сделать. –

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> 
+0

Вместо этого вы должны использовать 'MyArray.prototype = Object.create (Array.prototype)'. – Bergi

3

Вы можете инициализировать экземпляр, проверяя аргументы в конструкторе и подталкивать их, если это применимо. Вы можете спросить себя, действительно ли вам нужен пользовательский конструктор , чтобы имитировать 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>

+0

@abforce: см. Отредактированный фрагмент. – KooiInc

+0

Да, ты совершенно прав! –

+0

Обратите внимание, что 'length' все еще не работает. Попытайтесь добавить строку 'foo [6] = 7;' после создания экземпляра. ('foo.push (7)' будет работать, поскольку он вручную обновляет '.length') – Bergi

Смежные вопросы