2010-02-09 13 views

risposta

12

Hai ragione, ma ora nel ECMAScript 5 ° edizione, il metodo Object.create è in grado di creare istanze di oggetti utilizzando un altro oggetto come un prototipo:

var proto = {foo: 1}; 
var obj = Object.create(proto); 

Nell'esempio di cui sopra, saranno creati obj e conterrà un riferimento alla proto nella proprietà interna [[Prototype]], e:

obj.foo; // 1 
obj.hasOwnProperty('foo'); // false 

Questo metodo è dalla nuova specifica approvata nel dicembre 2009, per quanto ho visto oggi è ava applicabile all'implementazione Mozilla JavaScript 1.9.3.

Per ora è possibile simulare il comportamento di tale metodo da questo, come proposto dal Douglas Crockford:

if (typeof Object.create !== 'function') { 
    Object.create = function (o) { 
    function F() {} 
    F.prototype = o; 
    return new F(); 
    }; 
} 
+1

Cornford una volta ha proposto una versione leggermente più efficiente di "generare" (a proposito, originariamente menzionato da Lasse Nielsen, non Crockford), dove la funzione "dummy" ('F' nel tuo esempio) è memorizzata in una chiusura e viene riutilizzata. Questo rende più efficiente (e runtime) l'implementazione efficiente. Si noti inoltre che l'emulazione di 'Object.create' di Crockford non è conforme a ES5 (nessun supporto per il secondo argomento, nessun tipo di controllo del primo argomento per lanciare TypeError se non è un oggetto, ecc.). Impiegare con cura;) – kangax

+0

Sei un risparmiatore di vita. Ho letteralmente setacciato il web per questa idea tutto il giorno. –

Problemi correlati