придётся заставить себя не использовать сеттеры длины массива, а использовать встроенные методы
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, время: 01:00. |