Jak skopiować prototyp do istniejącego obiektu?

2015-01-16 15:50
Krwawy Mleczarz
0

Mamy taki kod

function Test(x,y) { this.x = x; this.y = y; return this; }
var t = new Test(1,2);
Test.prototype.testuj = function() { console.log(3); };
t.testuj(); //prints 3
var t2 = { x: 2, y: 3};

Jak zrobic aby t2 mial metode testuj oraz inne prototypowe metody, ale bez wywoływania konstruktora Test (żeby nie przesłonił mi istniejących metod)? Czy jedyną opcją jest stworzenie nowej instancji Test t3 i przejście po właściwościach t2 i przypisaniu ich do t3?

Pozostało 580 znaków

2015-01-16 16:00
0

Możesz skorzystać z __proto__ https://developer.mozilla.org[...]e/Global_Objects/Object/proto

var Test = function(x, y) {
  this.x = x;
  this.y = y;
};
Test.prototype.testuj = function() {
  console.log(this.x);
};

var otherT = { x: 100, y: 20 };
otherT.__proto__ = Test.prototype;

otherT.testuj();

http://ideone.com/1fGV2n

Anyway.. nie wydaje mi się to najlepszym wyjściem. Dlaczego nie możesz po prostu użyć konstruktora do utworzenia tego obiektu?

Pozostało 580 znaków

2015-01-16 16:10
1

albo możesz pożyczyć sobie funkcję i wywołać ją w kontekście innego obiektu:

Test.prototype.testuj.call(t2); // wywolanie metody testuj z Test.prototype w kontekście obiektu t2.

albo nawet przypisać ją na chama na swojego obiektu:

t2.testuj = Test.prototype.testuj;
t2.testuj();

chociaż nie jest zalecane dodawanie nowych metod do już istniejących obiektów (bo to ponoć psuje optymalizację maszyny wirtualnej, przynajmniej w Chrome).

możesz w ogóle odejść od metod na rzecz normalnych funkcji:

function testuj(obj) {
   console.log(obj.x);
}

albo tak jak pisałeś

stworzenie nowej instancji Test t3 i przejście po właściwościach t2 i przypisaniu ich do t3?

będzie miało to pewne wady, ale też powinno działać...
zależy co chcesz zrobić, jaki efekt, jaki masz problem.

zamiana znacznika <code class="javascript"> na <quote> - @furious programming


((0b10*0b11*(0b10**0b101-0b10)**0b10+0b110)**0b10+(100-1)**0b10+0x10-1).toString(0b10**0b101+0b100);
edytowany 1x, ostatnio: furious programming, 2015-01-16 16:22
Do cytowania używaj znaczników &lt;quote&gt; - furious programming 2015-01-16 16:22
to się nazywa hiperpoprawność ;) - LukeJL 2015-01-16 17:01
Niech Ci będzie... ;P - furious programming 2015-01-16 18:45

Pozostało 580 znaków

2015-01-16 16:11
Krwawy Mleczarz
0

Dostaje go po reście.

Pozostało 580 znaków

2015-01-16 16:14
0

To IMO najlepiej będzie zrobić zestaw zwykłych funkcji (jak napisał @LukeJL w poście wyżej) operujących na otrzymywanych obiektach.

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0