2012-07-27 6 views
6

ser un principiante en javascript, traté de entender Object.create() Método de aquímétodo Object.create en javascript

https://developer-new.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create

En el código de ejemplo, la línea 18. Una propiedad de acceso se crea con escribible establecido en verdadero. También leí que escribir es solo para descriptores de datos.

correr intentado,

var o = Object.create(Object.prototype, { 
    // foo is a regular "value property" 
    foo: { 
    writable:true, configurable:true, value: "hello" 
    }, 
    // bar is a getter-and-setter (accessor) property 
    bar: { 
    writable: true, 
    configurable: false, 
    get: function() { return 10 }, 
    set: function(value) { console.log("Setting `o.bar` to", value) } 
    } 
    }); 
console.log(o); 

me sale invalid property error.

+0

¿es incorrecta la referencia de mozilla? – John

+0

La referencia de Mozilla era de hecho incorrecta. Es un wiki, así que simplemente inicié sesión y lo solucioné. (Están implementando una nueva wiki muy pronto, por lo que es posible que aún no vea la solución, dependiendo de si está inscrito en la versión beta, creo.) – apsillers

Respuesta

12

El problema es que writable y set/get son mutuamente excluyentes. El código genera este error útiles en Chrome:

Invalid property. A property cannot both have accessors and be writable... 

Esto tiene algún sentido lógico: si tiene set/get descriptores de acceso sobre una propiedad, que la propiedad nunca se va a escribir en y/o leer, ya que cualquier los intentos de leer/escribir serán interceptados por las funciones de acceso. Si definimos una propiedad como writabley darle de acceso de funciones, que está diciendo al mismo tiempo:

  1. "El valor de esta propiedad puede ser directamente alterada", y
  2. "Bloquear todos los intentos de leer y/o escribe en esta propiedad; en su lugar, utiliza estas funciones ".

El error simplemente le impide especificar una contradicción. Supongo que por el hecho de que escribió un getter y setter, realmente no desea que la propiedad sea writable. Simplemente elimine esa línea y su código se ejecutará perfectamente.

+1

+1. Simplemente elimine el bit 'writeable: true' de' bar', y está bien. – Amadan

+0

supongo que la referencia de mozilla es incorrecta. – John

+0

@John Puede que le interese la publicación del blog John Resigs sobre ECMAScript 5: http://ejohn.org/blog/ecmascript-5-objects-and-properties/ –

10

Última respuesta, no buscando votos, pero esperando que esto sea útil.

Hay dos tipos de propiedades.Cada propiedad es o bien:

  1. una propiedad de datos que tiene estos cuatro atributos:

    • valor
    • grabable
    • enumerables
    • configurable
  2. o un descriptor de acceso propiedad que tiene estos cuatro atributos:

    • llegar
    • conjunto
    • enumerables
    • configurable

Por lo tanto no hay ninguna propiedad que puede tener tanto get y writable. ¡Así es como es JavaScript! Consulte la sección 8.6 del ECMAScript Standard para conocer los detalles sangrientos.

+0

Esta respuesta fue muy útil para mí. Obtuve el mismo error, a pesar de que escribí en false. Ahora entiendo, porque había definido un 'obtener', la propiedad era una 'propiedad de acceso' y, por lo tanto, es ilegal establecer cualquier valor para 'escribir' (incluso si lo configura en falso) –

Cuestiones relacionadas