2012-01-25 4 views
7

De vez en cuando hay una JS framework o biblioteca que piensa que es una buena idea agregar algunas características nuevas en el prototipo de Object o Array. No puedo encontrar más ejemplos en este momento, pero sí recuerdo que he tenido problemas con eso antes. Por supuesto, al hacerlo se rompe el viejo bucle for(...in...), porque de repente esas propiedades ahora también se enumeran. Para evitarlo, debe verificar cada propiedad enumerada con .hasOwnProperty() antes de acceder. Que es engorroso, cuando se trata de escribir código robusto.¿Puedes hacer un objeto en Javascript que NO herede de Object?

Así que me pregunto: ¿hay alguna forma de que yo pueda hacer mis propios objetos para que no hereden de Object? El juego inicial con .prototype no arrojó ningún resultado. Tal vez hay algún truco para eso? ¿O todo siempre heredará desde Object y no hay nada que pueda hacer al respecto?

Agregado: Supongo que debería haber notado que lo quiero para las secuencias de comandos del cliente en los navegadores, y la compatibilidad debe incluir IE6, o al menos IE7. Otros requisitos de la versión del navegador son más indulgentes, aunque cuanto más mejor, por supuesto. (Sí, por desgracia, el mundo empresarial aún vive en el IE-mundo ...)

+0

* bad * old 'for (... in ...)' loop seguramente –

+1

@RobAgar - why so? Realmente, estoy cansado de escribir cosas como 'for (var i, l = myArray.length; i

+0

generalmente los marcos que cambian el prototipo, también proporcionan una forma de recorrer los elementos. En Mootools, 'myObj.each()' hará el trabajo ... también '[" foo "," bar "]. Each()' – pleasedontbelong

Respuesta

4

En ECMAScript 5 se puede pasar a nullObject.create:

> obj = Object.create(null); 
    Object 
    No Properties 
+0

¡Guau! ¡Increíble! ¡Realmente funciona! Excepto que la compatibilidad del navegador es pésima. :(Supongo que debería haber dicho que lo necesito para IE6, o al menos IE7. –

+0

Creo que en ese caso no tiene suerte y usar '.hasOwnProperty' es su única oportunidad. –

1

Puede eliminar explícitamente propiedades de objetos que son numerables, pero los navegadores moderados permiten métodos de Objetos no enumerables.

Aunque debería funcionar en navegadores más antiguos.

function Myobject(props){ 
} 
var O=Object,OP=Object.prototype; 
for(var p in O)delete Myobject[p]; 
for(var p in OP)delete Myobject.prototype[p]; 
+0

Una idea interesante, lo intentaré. también, si no son enumerables, entonces ya está bien. En primer lugar, solo me importan los enumerables. –

Cuestiones relacionadas