Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как заменить прототип в созданном объекте? (https://javascript.ru/forum/misc/39291-kak-zamenit-prototip-v-sozdannom-obekte.html)

Shitbox2 24.06.2013 14:11

Как заменить прототип в созданном объекте?
 
Дело в том, что свойства объекта трогать нельзя, т.е. нельзя создать объект с нужным прототипом и скопировать в него свойства исходного. Нужно в исходном объекте заменить один прототип на другой. Как это сделать?

Obj.prototype = newProtoObj

не работает

Shitbox2 24.06.2013 14:39

Но __proto__ не везде доступна, поэтому не хочу через нее.
А дело в том, что сторонний плагин поставляет объекты со своим прототипом. Мне же нужно дополнять ими собственные объекты, причем ссылки на них не должны меняться. Делать свои объекты сразу из нужного прототипа не могу, потому что у плагина нет такой функции получить пустой объект или прототип. Можно, конечно, скопировать свойства прототипа прямо в объект, что, в общем, устраивает, но как-то не слишком это красиво... Вот такая делема)

danik.js 24.06.2013 15:55

Нет другого способа. Кстати либа Zepto именно поэтому не работает в IE.
Там коллекция представляет из себя массив с подмененным прототипом (как раз через __proto__ )

Кстати, возможно ли преобразовать массив в простой объект без итерирования?
То есть
//имеем массив:
var array = ["a", "b"]
//имеем пустой объект:
var object = {length:0}
/* какая-то магия ... главное без итераций */
// получаем объект:
object // {0: "a", 1: "b", length: 2}, length можно присвоить вручную

devote 24.06.2013 16:01

Цитата:

Сообщение от danik.js
Кстати, возможно ли преобразовать массив в простой объект без итерирования?

var array = ["a", "b"];
alert(Object.prototype.toString.call(array));

var object = Object.create(array);
alert(Object.prototype.toString.call(object));

alert(object.length);

danik.js 24.06.2013 17:01

Не не. Нафига в прототип то засунул? Тем более прототипом будет иной объект (набор функций). Задача совершенно другая.

nerv_ 24.06.2013 21:38

Цитата:

Сообщение от Shitbox2
Как заменить прототип в созданном объекте?

Цитата:

Сообщение от Shitbox2
Можно, конечно, скопировать свойства прототипа прямо в объект, что, в общем, устраивает, но как-то не слишком это красиво...

копируй в один объект (или прототип функции) и на его (ее) основе создавай другие

var creator = {}; // объект в кот. скопировали

// или

function foo() {}
foo.prototype = {}; // объект в кот. скопировали


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