Pregunta Definición de propiedades de solo lectura en JavaScript


Dado un objeto obj, Me gustaría definir una propiedad de solo lectura 'prop' y establecer su valor a val. ¿Es esta la manera correcta de hacer eso?

Object.defineProperty( obj, 'prop', {
    get: function () {
        return val;
    }
});

El resultado debería ser (para val = 'test')

obj.prop; // 'test'
obj.prop = 'changed';
obj.prop; // still 'test' since it's read-only

Este método funciona por cierto: http://jsfiddle.net/GHMjN/
No estoy seguro de si esta es la forma más fácil / más suave / más adecuada para hacerlo ...


37
2017-10-13 16:32


origen


Respuestas:


En su lugar, podría usar el writable propiedad del descriptor de la propiedad, lo que evita la necesidad de un get Accesor:

var obj = {};
Object.defineProperty(obj, "prop", {
    value: "test",
    writable: false
});

Esto es ECMAScript 5, por lo que no funcionará en navegadores más antiguos.


71
2017-10-13 16:46



Debido a los navegadores antiguos (compatibilidad con versiones anteriores) tuve que buscar funciones de acceso para las propiedades. Lo hice parte de bob.js:

var obj = { };
//declare read-only property.
bob.prop.namedProp(obj, 'name', 'Bob', true);
//declare read-write property.
bob.prop.namedProp(obj, 'age', 1);

//get values of properties.
console.log(bob.string.formatString('{0} is {1} years old.', obj.get_name(), obj.get_age()));
//set value of read-write property.
obj.set_age(2);
console.log(bob.string.formatString('Now {0} is {1} years old.', obj.get_name(), obj.get_age()));

//cannot set read-only property of obj. Next line would throw an error.
// obj.set_name('Rob');

//Output:
//========
// Bob is 1 years old.
// Now Bob is 2 years old.

Espero que ayude.


0
2017-11-03 13:23



En nuevos navegadores o node.js es posible usar Apoderado para crear un objeto de solo lectura

var obj = {
    prop: 'test'
}

obj = new Proxy(obj ,{
    setProperty: function(target, key, value){
        if(target.hasOwnProperty(key))
            return target[key];
        return target[key] = value;
    },
    get: function(target, key){
        return target[key];
    },
    set: function(target, key, value){
        return this.setProperty(target, key, value);
    },
    defineProperty: function (target, key) {
        return this.setProperty(target, key, value);
    },
    deleteProperty: function(target, key) {
        return false;
    }
});

Aún puede asignar nuevas propiedades a ese objeto, y también serían de solo lectura.

Ejemplo

obj.prop
// > 'test'

obj.prop = 'changed';
obj.prop
// > 'test'

// New value
obj.myValue = 'foo';
obj.myValue = 'bar';

obj.myValue
// > 'foo'

0
2018-06-09 06:13