2012-07-01 5 views
6

Desde el nodo repl:¿Cómo cambiar los valores enumerables y configurables escribibles de una propiedad de objeto Javascript?

foo = { bar: 'baz'}; 
console.log (Object.getOwnPropertyDescriptor(foo, 'bar')) 

valor devuelto:

{ value: 'baz', 
    writable: true, 
    enumerable: true, 
    configurable: true } 

¿Cómo se cambia el permiso de escritura numerable, y configurable a falso? ¿Cómo se llaman estos valores? ¿Son parte de ES5.1? ¿Hay más que el repl no produjo?

+0

Por favor, utilice el botón '{}' a formatee su código, sin cursivas, negrita, etc ... –

Respuesta

13

"¿Cómo se puede cambiar el enumerable escribible y configurable en falso?"

Object.defineProperty(foo, 'baz', { 
    enumerable:false, 
    writable:false, 
    configurable:false 
}); 

También hay Object.defineProperties, lo que es lo mismo, excepto puede establecer múltiples propiedades, y Object.create, que vamos a crear un nuevo objeto, y establecer su objeto prototipo, y sus descriptores.

"¿Cómo se llaman estos valores?"

Descripciones de las características.

"¿Son parte de ES5.1?"

Sí, ES5.

"¿Hay más de lo que el repl no produjo?"

¿Qué descripción de la propiedad? No.

+1

+1 una respuesta completa. – undefined

+0

Creo que este método anterior no es compatible con IE8, pero en ecmascript clásico, es decir, versiones anteriores ¿podemos controlar la enumeración y la configuración de las propiedades? –

+0

¿Cómo puedo cambiar las descripciones de un objeto existente? – mqklin

1

bizquera: Creo que hay un pequeño error de tipeo en su respuesta.

Su código:

Object.defineProperty(foo, 'baz', { 
enumerable:false, 
writable:false, 
configurable:false 
}); 

pero el segundo argumento debe ser el nombre de la propiedad y no el valor, por lo que el código correcto es:

Object.defineProperty(foo, 'bar', { 
enumerable:false, 
writable:false, 
configurable:false 
}); 
+3

Use 'edit' luego. – m93a

0

sólo quería añadir esto en

Puede cambiar los atributos al crear un objeto como este:

var newObj = Object.defineProperty({}, 'aPropertyName', { 
    enumerable:false, 
    writable:false, 
    configurable:false 
}); 

Puede también, puede modificar varias propiedades a la vez:

var newObj = Object.defineProperties({}, { 
    aPropertyName: {enumerable: false, writable: false, configurable: false}, 
    anotherPropertyName: {enumerable: true, writable: true, configurable: false}, 
    finalPropertyName: {enumerable: true, writable: false, configurable: true}, 
}); 

Y por supuesto que pasa en el nombre del objeto con el método anterior:

Object.defineProperties(objectName, { 
    aPropertyName: {enumerable: false, writable: false, configurable: false}, 
    anotherPropertyName: {enumerable: true, writable: true, configurable: false}, 
    finalPropertyName: {enumerable: true, writable: false, configurable: true}, 
}); 
Cuestiones relacionadas