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

He estado tratando de averiguar qué pasa con esto hace bastante tiempo. ¿Por qué esto no funciona? Sin embargo, funciona cuando se utiliza la siguiente manera:Agregar prototipo a JavaScript Object Literal

STORE.item.prototype.add(); 

Respuesta

71

se entiende el objeto prototipo para ser utilizado en constructor functions, básicamente funciones que serán llamadas utilizando el new operator para crear nuevas instancias de objetos.

Funciones en JavaScript son first-class objetos, lo que significa que puede agregar miembros a ellos y tratarlos como objetos ordinarios:

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

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

Un uso típico del objeto prototipo como he dicho antes, es cuando se ejemplariza un objeto llamando a una función constructor con el nuevo operador, por ejemplo:

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

var obj = new SomeObject(); 

Todas las instancias de SomeObject heredarán los miembros de la SomeObject.prototype, porque se tendrá acceso a los miembros º áspero la cadena del prototipo.

Todas las funciones en JavaScript tienen un prototipo de objeto porque no hay forma de saber qué funciones están destinadas a ser utilizadas como constructores.

+0

¡Muchas gracias por la explicación y el enlace! Es mucho más claro para mí ahora. :) – John

+0

De nada, John, ¡me alegro de ayudar! – CMS

+1

¡Gran explicación! ¡¡Pulgares hacia arriba!! –

2

Puede usar reactivadores JSON para convertir su JSON en objetos de clase en el tiempo de análisis. El proyecto EcmaScript 5 ha adoptado el esquema descrito en el resucitador JSON2 http://JSON.org/js.html

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

El parámetro opcional resucitador es una función que será llamado para cada clave y el valor en todos los niveles del resultado final . Cada valor será reemplazado por el resultado de la función reviver . Esto se puede usar para reformar objetos genéricos en instancias de pseudoclases , o para transformar cadenas de fecha en objetos de fecha.

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

Es bueno saber esta información. +1. Un ejemplo un poco más detallado con myJSONtext y los detalles de la función de tipo habría sido aún mejor, pero de todos modos ¡gracias por esta información! –

9

Después de muchos años, cuando JavaScript (ES2015 llega) tenemos finalmente Object.setPrototypeOf() método

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

 

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

 

 
STORE.item.add();

1

partir de este escrito esto es posible mediante el uso de la propiedad __proto__. Por si acaso alguien aquí está revisando en el presente y probablemente en el futuro.

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

const pug = {} 
pug.__proto__ = dog; 

pug.bark(); 

Sin embargo, la forma recomendada de añadir prototipo en este caso se utiliza el Object.create. Así que el código anterior se traduce a:

const pug = Object.create(dog) 

pug.bark(); 

O también se puede utilizar Object.setPrototypeOf como se menciona en una de las respuestas.

Espero que ayude.

Cuestiones relacionadas