придётся заставить себя не использовать сеттеры длины массива, а использовать встроенные методы
function ArrayLike () { /* NULL */} // Object.create легко эмулируется //ArrayLike.prototype = Object.create(Array.prototype); // вот так, например var noop = function () {}; noop.prototype = Array.prototype; ArrayLike.prototype = new noop(); ArrayLike.prototype.constructor = ArrayLike; // расширим ArrayLike.prototype.TEST = "Hello World!"; var a = new ArrayLike(); // опробуем новый супер-массив a.push("a"); alert (a.length + '\n' + a); a.push("b"); a.push("c"); alert (a.length + '\n' + a); // повыводим типы alert( "type: " + typeof(a) ); alert( "class: " + Object.prototype.toString.call(a) ); // и проверим, не тронули ли мы пртотип массива alert( "a.test : " + a.TEST ); alert( "[].test : " + ['нету тут такого'].TEST); // и тут тоже alert( "new Array().test : " + new Array().TEST); |
melky,
и зачем в прототип делать Object.create а не просто создать массив? хоть одну причину назови |
Цитата:
|
ты не ответил на мой вопрос)
|
function MyArray() {} MyArray.prototype = []; MyArray.prototype.toString = function(){alert('ну вы нубы')}; var q = new MyArray(); alert(Object.prototype.toString.call(q)); alert('— мы нубы? \n— ' + Array.isArray(q)); q.push(1); q.push(1); alert( 'concat:' + [].concat(q) ); alert( 'а должно быть: ' + [].concat([1,1]) ); |
melky, ключевые моменты:
alert( Array.isArray(myArray) ) // true alert( Object.prototype.toString.call(myArray) ) // [object Array] myArray[0] = 'x' // myArray.length // 1 myArray[1] = 'y', [].concat(myArray) // ['x','y'] |
тогда удачи :) не понимаю, зачем это нужно
|
|
Цитата:
Я так и предполагал что то, что я спросил - невозможно. Хотел удостовериться. Придется переделывать на объектах. В принципе коллекции и должны представлять из себя объекты, а не массивы. Так что это изначально ошибка архитектуры. Проблема в том, что потеряется обратная совместимость. Всем спасибо. |
а я вот так и не понял чо ему надо...
|
Часовой пояс GMT +3, время: 04:09. |