2012-09-27 14 views
6

W języku JavaScript obiekt prototypowy każdej funkcji ma nieprzeliczalną właściwość constructor, która wskazuje na funkcję (EcmaScript §13.2). To nie jest wykorzystywana w jakiejkolwiek natywnej funkcjonalności (np tylko instanceof sprawdza łańcuch prototypu), jednak are encouraged to adjust it podczas nadpisywania własność funkcji prototype do dziedziczenia:Do czego właściwie służy właściwość `constructor`?

SubClass.prototype = Object.create(SuperClass.prototype, { 
    constructor: {value:SubClass, writable:true, configurable:true} 
}); 

Ale mamy (w tym mnie) zrobić tylko dla jasności i schludności? Czy istnieją rzeczywiste przypadki użycia, które polegają na constructor property?

+0

Co rozumiem przez moją właściwość konstruktora, aby sprawdzić, czy dany obiekt jest tworzony lub konstruowany przez który konstruktor funkcjonalny. – Apurv

+0

związanych: [Czy istnieje dobry przypadek użycia dla właściwości konstruktora w JavaScript?] (Http://stackoverflow.com/questions/8073867/is-there-a-good-using-case-for--constructor-property -in-javascript), chociaż odpowiedzi nie są pomocne – Bergi

+0

Zobacz też: [Dlaczego konieczne jest ustawienie prototypowego konstruktora?] (http://stackoverflow.com/q/8453887/1048572) – Bergi

Odpowiedz

2

naprawdę nie mogę zrozumieć, dlaczego właściwość constructor to co to jest w JS. I od czasu do czasu znaleźć się go używać, aby dostać się do prototypów przedmiotów (np obiektu Event) w IE < 9. Jednak ja sądzę, że tam, aby umożliwić pewne ppl naśladować klasyczne konstrukcje programistyczne OO

function Foo() 
{ 
    this.name = 'Foo'; 
} 
function Bar() 
{ 
    this.name = 'Bar'; 
} 
function Foobar(){}; 
Foo.prototype = new Foobar; 
Foo.prototype.constructor = Foo; 
Bar.prototype = new Foobar; 
Bar.prototype.constructor = Bar; 
var foo = new Foo(); 
var bar = new Bar(); 
//so far the set-up 
function pseudoOverload(obj) 
{ 
    if (!(obj instanceof Foobar)) 
    { 
     throw new Error 'I only take subclasses of Foobar'; 
    } 
    if (obj.constructor.name === 'Foo') 
    { 
     return new obj.constructor;//reference to constructor is quite handy 
    } 
    //do stuff with Bar instance 
} 

Więc AFAIK , że „korzyści” nieruchomości konstruktora są:

  • uruchamianiu nowych obiektów z instancji łatwo
  • mogąc grupy swoje obiekty jako będących podklasy o certa w klasie, ale wciąż jest w stanie sprawdzić, z którym typem podklasy mamy do czynienia.
  • Jak mówisz: bycie porządnym.
0

Co rozumiem właściwości konstruktora jest używany do sprawdzenia, czy dany obiekt jest tworzony lub zbudowany przez który konstruktor funkcjonalny.

ten jest doskonałym przykładem na to samo: http://www.klauskomenda.com/code/javascript-inheritance-by-example/

+0

Ten artykuł nie używa własność 'constructor'. Możesz przeczytać http://joost.zeekat.nl/constructors-considered-mildly-confusing.html, aby zrozumieć o co proszę :-) – Bergi

+0

Niestety mam na myśli prototyp..my zły :) – Apurv