Jak skopiować prototyp do istniejącego obiektu?

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?

0

Możesz skorzystać z __proto__ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/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?

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

0

Dostaje go po reście.

0

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

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