2009-10-20 19 views
46
STORE = { 
    item : function() { 
    } 
}; 
STORE.item.prototype.add = function() { alert('test 123'); }; 
STORE.item.add(); 

Ho cercato di capire cosa c'è che non va in questo un bel po 'di tempo. Perché non funziona? Tuttavia, funziona quando uso il seguente:Aggiunta del prototipo all'oggetto JavaScript Letterale

STORE.item.prototype.add(); 

risposta

71

L'oggetto prototipo è pensato per essere utilizzato su constructor functions, fondamentalmente le funzioni che saranno chiamati con il new operator per creare nuove istanze di oggetti.

funzioni in JavaScript sono first-class oggetti, il che significa che è possibile aggiungere membri a loro e li trattano come oggetti comuni:

var STORE = { 
    item : function() { 
    } 
}; 

STORE.item.add = function() { alert('test 123'); }; 
STORE.item.add(); 

Un utilizzo tipico della all'oggetto prototipo come ho detto prima, è quando si crea un'istanza un oggetto chiamando una funzione di costruzione con l'operatore new, per esempio:

function SomeObject() {} // a constructor function 
SomeObject.prototype.someMethod = function() {}; 

var obj = new SomeObject(); 

Tutte le istanze di SomeObject erediteranno i membri del SomeObject.prototype, perché quei membri saranno accessibili ° ruvida la catena del prototipo.

Ogni funzione in JavaScript ha un oggetto prototipo perché non c'è modo di sapere quali funzioni sono destinate ad essere utilizzate come costruttori.

+0

Grazie mille per la spiegazione e il collegamento! Adesso è molto più chiaro per me. :) – John

+0

Siete i benvenuti @ John, felice di aiutare! – CMS

+1

Grande spiegazione! pollice su!! –

2

È possibile utilizzare i revisori JSON per trasformare il JSON in oggetti di classe in fase di analisi. L'EcmaScript 5 progetto ha adottato lo schema reviver JSON2 descritto http://JSON.org/js.html

var myObject = JSON.parse(myJSONtext, reviver); 

il parametro reviver opzionale è una funzione che verrà chiamata per ogni chiave e il valore ad ogni livello del risultato finale . Ogni valore sarà sostituito dal risultato della funzione reviver . Questo può essere usato per riformare gli oggetti generici in istanze di pseudoclasse o per trasformare le stringhe di data in oggetti Data.

myData = JSON.parse(text, function (key, value) { 
    var type; 
    if (value && typeof value === 'object') { 
     type = value.type; 
     if (typeof type === 'string' && typeof window[type] === 'function') { 
      return new (window[type])(value); 
     } 
    } 
    return value; 
}); 
+0

Buono a sapersi questa informazione. +1. Un esempio un po 'più dettagliato con myJSONtext e i dettagli della funzione type sarebbero stati ancora migliori, ma comunque grazie per queste informazioni! –

9

Dopo molti anni, quando JavaScript (ES2015 arriva) abbiamo finalmente Object.setPrototypeOf() metodo

const STORE = { 
 
    item: function() {} 
 
}; 
 

 

 
Object.setPrototypeOf(STORE.item, { 
 
    add: function() { 
 
    alert('test 123'); 
 
    } 
 
}) 
 

 

 
STORE.item.add();

1

in cui scriviamo questo è possibile utilizzando la proprietà __proto__. Nel caso in cui qualcuno qui stia verificando al momento e probabilmente in futuro.

const dog = { 
    name: 'canine', 
    bark: function() { 
     console.log('woof woof!') 
    } 
} 

const pug = {} 
pug.__proto__ = dog; 

pug.bark(); 

Tuttavia, il metodo consigliato di aggiungere prototipo in questo caso sta usando il Object.create. Così il codice di cui sopra sarà tradotto a:

const pug = Object.create(dog) 

pug.bark(); 

Oppure si può anche utilizzare Object.setPrototypeOf come accennato in una delle risposte.

Spero che questo aiuti.

Problemi correlati