Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как создать массив с особым прототипом? (https://javascript.ru/forum/misc/36783-kak-sozdat-massiv-s-osobym-prototipom.html)

melky 27.03.2013 19:32

придётся заставить себя не использовать сеттеры длины массива, а использовать встроенные методы

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);

megaupload 27.03.2013 19:39

melky,
и зачем в прототип делать Object.create а не просто создать массив? хоть одну причину назови

melky 27.03.2013 19:50

Цитата:

Сообщение от megaupload (Сообщение 242990)
melky,
и зачем в прототип делать Object.create а не просто создать массив? хоть одну причину назови

мне ..... а нет, погоди. так почему всё-таки TypeScript работает быстрее JavaScript?

megaupload 27.03.2013 20:32

ты не ответил на мой вопрос)

danik.js 27.03.2013 22:12

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]) );

danik.js 27.03.2013 22:27

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']

melky 28.03.2013 00:17

тогда удачи :) не понимаю, зачем это нужно

Aetae 28.03.2013 00:54

http://javascript.ru/forum/css-html-...-ie-8-a-2.html

danik.js 28.03.2013 06:42

Цитата:

Сообщение от melky
не понимаю, зачем это нужно

Я же объяснял: чтобы заставить zepto работать с IE9+ (или хотя бы с 10).
Я так и предполагал что то, что я спросил - невозможно. Хотел удостовериться.
Придется переделывать на объектах. В принципе коллекции и должны представлять из себя объекты, а не массивы. Так что это изначально ошибка архитектуры. Проблема в том, что потеряется обратная совместимость.

Всем спасибо.

megaupload 28.03.2013 11:14

а я вот так и не понял чо ему надо...


Часовой пояс GMT +3, время: 04:09.