A menudo se dice que cada objeto Javascript tiene una propiedad prototype
, pero me parece que foo.prototype
tiene un valor solo si foo
es una función.Se dice que todos los objetos Javascript tienen una propiedad de prototipo, pero solo veo foo.prototype si foo es una función?
En Chrome y Firefox, obj.__proto__
tiene un valor - ¿es esta la propiedad dicha prototype
? Pero en IE 9, no funcionará (¿hay alguna forma que pueda?), Y pensé que por prototype
propiedad, eso significa que obj.prototype
debería funcionar?
entiendo que Object.getPrototypeOf(obj)
parece mostrar esta prototype
propiedad, pero ¿por qué necesita un método especial para conseguirlo? ¿Por qué no simplemente como person.name
, que es obtener la propiedad name
del objeto person
?
Actualización: por cierto, obj.constructor.prototype
parece veces ser ese prototipo, pero a veces no, como en el siguiente código de hecho con herencia de prototipos con ningún constructor: (este método es en el Pro Javascript Patrones de diseño libro de Harmes y Díaz por 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__);
el resultado mostrará falso, falso, cierto, cierto desde hace 4 líneas.
Todos los objetos están relacionados con un prototipo, pero no necesariamente por una propiedad visible. En otras palabras, las partes internas del tiempo de ejecución de JavaScript saben cuál es el objeto prototipo, pero es posible que su código no pueda determinar cuál es. En cuanto a * por qué * eso es cierto, bueno, es solo la forma en que se implementó JavaScript. – Pointy
Cualquiera que diga "cada objeto JavaScript tiene una propiedad prototipo" se refiere a la propiedad interna (expuesta como '__proto__' en la mayoría de los navegadores, como usted mencionó). –
Eche un vistazo a esta pregunta similar: http://stackoverflow.com/questions/9451881/ –