Si dice spesso che ogni oggetto Javascript ha una proprietà prototype
, ma trovo che foo.prototype
abbia un valore solo se foo
è una funzione.Si dice che tutti gli oggetti Javascript abbiano una proprietà prototipo, ma vedo solo foo.prototype se foo è una funzione?
Su Chrome e Firefox, obj.__proto__
ha un valore - è questa la proprietà prototype
? Ma su IE 9, non funzionerà (c'è un modo che può?), E ho pensato per la proprietà prototype
, che significa che obj.prototype
dovrebbe funzionare?
Capisco che Object.getPrototypeOf(obj)
sembra mostrare questa proprietà prototype
, ma perché è necessario un metodo speciale per ottenerlo? Perché non solo come person.name
, che è quello di ottenere la proprietà dell'oggetto person
?
Aggiornamento: a proposito, obj.constructor.prototype
sembra volte essere quel prototipo, ma a volte non, come nel codice seguente fatto con ereditarietà prototipale con nessun costruttore: (questo metodo è nella Pro Javascript design Patterns libro di Harmes e Diaz da Apress 2008, p. 46)
var Person = {
name: 'default value',
getName: function() {
return this.name;
}
}
var reader = clone(Person);
console.log(reader.getName());
reader.name = "Ang Lee";
console.log(reader.getName());
function clone(obj) {
function F() {};
F.prototype = obj;
return new F;
}
console.log("the prototype of reader is", Object.getPrototypeOf(reader));
console.log(Object.getPrototypeOf(reader) === reader.constructor.prototype);
console.log(Object.getPrototypeOf(reader) == reader.constructor.prototype);
console.log(Object.getPrototypeOf(reader) === reader.__proto__);
console.log(Object.getPrototypeOf(reader) == reader.__proto__);
il risultato mostrerà falso, falso, vero, vero per gli ultimi 4 linee.
Gli oggetti sono tutti correlati a un prototipo, ma non necessariamente a una proprietà visibile. In altre parole, gli interni del runtime JavaScript sanno qual è l'oggetto prototipo, ma potrebbe non essere possibile per il codice determinare quale sia. Per quanto riguarda * perché * questo è vero, beh, è proprio il modo in cui è stato implementato JavaScript. – Pointy
Chiunque dice che "ogni oggetto JavaScript ha una proprietà prototipo" fa riferimento alla proprietà interna (esposta come '__proto__' sulla maggior parte dei browser, come accennato). –
Dai un'occhiata a questa domanda simile: http://stackoverflow.com/questions/9451881/ –