2010-08-10 22 views
7

Mam jakiś obiekt, na przykład son, który chciałbym dziedziczyć z innego obiektu father.Dodawanie prototypu do obiektu literalnego

Oczywiście mogę zrobić funkcję konstruktora dla ojca, jak

Father = function() { 
    this.firstProperty = someValue; 
    this.secondProperty = someOtherValue; 
} 

a następnie użyć

var son = new Father(); 
son.thirdProperty = yetAnotherValue; 

ale nie jest to dokładnie to, co chcę. Ponieważ son będzie miał wiele właściwości, łatwiej będzie mieć syna zadeklarowanego jako literał obiektowy. Ale nie wiem, jak ustawić prototyp.

Uprawiając jak

var father = { 
    firstProperty: someValue; 
    secondProperty: someOtherValue; 
}; 
var son = { 
    thirdProperty: yetAnotherValue 
}; 
son.constructor.prototype = father; 

nie będzie działać, ponieważ wydaje się, że łańcuch prototyp ma być ukryty i nie dbają o zmianie constructor.prototype.

myślę, że mogę użyć właściwości __proto__ w Firefoksie, jak

var father = { 
    firstProperty: someValue; 
    secondProperty: someOtherValue; 
}; 
var son = { 
    thirdProperty: yetAnotherValue 
    __proto__: father 
}; 
son.constructor.prototype = father; 

ale, o ile rozumiem, to nie jest to standardowa funkcja języka i lepiej jest nie używać go bezpośrednio.

Czy istnieje sposób na określenie prototypu obiektu literalnego?

+0

http://stackoverflow.com/questions/1592384/adding-prototype-to-object-literal –

Odpowiedz

11

masz rację, __proto__ jest właściwość niestandardowa, a tylko dwa standardowe sposoby trzeba ustawić nowy obiekt na [[Prototype]], to:

  • Poprzez użycie konstruktora i new operator (jak już wspomniałeś).
  • Metoda ECMAScript 5 Object.create.

Object.create nie widely supported jest jeszcze (działa na IE9Pre3 +, Firefox, Chrome 3.7Alpha + 5+ Safari 5+, Rhino 1.7), ale w pewnym momencie wszystkie implementacje będą zgodne spec ES5.

Może to zająć dwa argumenty, pierwszy to obiekt, który będzie używany jako [[Prototype]] nowego obiektu, a drugi to inny obiekt, w którym można opisać własne właściwości (w tej samej strukturze, co użyje Object.defineProperties).

Na przykład:

var father = { 
    firstProperty: 1, 
    secondProperty: 2 
}; 

var son = Object.create(father, { 
    thirdProperty: { 
    value: 'foo' 
    } 
}); 

father.isPrototypeOf(son); // true 
son.firstProperty; // 1 

son wewnętrzny [[Prototype]] nieruchomość będzie odnosić się do father i będzie zawierać właściwość wartość o nazwie thirdProperty.

+1

Twoja odpowiedź jasno wszystkie moje wątpliwości, ale niestety składnia Object.create (z dodatkiem „wartości”) wydaje jeszcze mniej czytelny. – Andrea

+1

Tak, dlaczego nie mogliby stworzyć funkcji, która po prostu akceptuje literalny obiekt. Chodzi mi o to, że przez większość czasu dbaliśmy tylko o klucze i wartości, a nie metadane właściwości, takie jak tworzenie tylko do odczytu. –

-1

Określenie prototypu dla literału obiektowego jest trochę "nietypowe", ponieważ przede wszystkim potrzebujesz prototypu na obiektach tworzonych przy użyciu składni konstruktora (np. Nowa X()). Nie mówię, że to niemożliwe ... ale to dziwne. Podobny wzór, który jest dobrze sprawdzony (na przykład używany przez jQuery), polega na zdefiniowaniu prototypu jako literału obiektu.Na przykład:

var X = function() {}; 
X.prototype = { 
    protoFunc1: function() {}, 
    protoFunc2: function() {} 
}; 
2

Niepoprawny jmar777. Jeśli na przykład masz

var X = function() {}; 
X.prototype = { 
    protoFunc1: function() { console.log('p1');}, 
    protoFunc2: function() { console.log('p2');} 
}; 

X.protoFunc1(); // is not a function 

To oznacza, że ​​to, co robisz:

X.prototype = {} 

jest tylko utworzenie obiektu o nazwie prototyp. Nie rzeczywisty prototyp. Aby użyć prototypu, musisz użyć funkcji konstruktora.

jeśli jednak zmodyfikować go do tej metody (konstruktora)

function X(){}; 
X.prototype.protoFunc1 = function() { 
    console.log('p1'); 
} 
X.prototype.protoFunc2 = function() { 
    console.log('p2'); 
} 

var x = new X(); 
x.protoFunc1(); //'p1' 

będzie ona działać.

Przeprowadź literalną metodę obiektową bez użycia prototypu lub użyj metody contructor za pomocą prototypu.

Powiązane problemy