свойство только для чтения - PullRequest
4 голосов
/ 24 августа 2009

Можно ли сделать свойство объекта javascript доступным только для чтения? Я хочу установить свойство, которое нельзя изменить ...

Ответы [ 3 ]

7 голосов
/ 24 августа 2009

Это возможно, но дорого. Вы можете сделать это, имея действительно закрытую переменную-член, а затем предоставив функцию доступа:

var NiftyThing = function() {
    var trulyPrivateVariable;

    trulyPrivateVariable = 5; // For instance
    this.accessorFunction = function() {
        return trulyPrivateVariable;
    }
};

Это работает, потому что функция доступа является замыканием над var. Стоимость заключается в том, что каждый экземпляр имеет свою собственную копию функции доступа.

РЕДАКТИРОВАТЬ: Использование:

var n = new NiftyThing();
alert(n.trulyPrivateVariable);
// Alerts "undefined"
alert(n.accessorFunction());
// Alerts "5"

Подробнее см. Частные переменные-члены в JavaScript .

1 голос
/ 09 сентября 2014

Вы можете реализовать что-то подобное, используя Object.defineProperty () :

function blockProperties(object, properties) {
    "use strict";
    // If not properties passed, then use the already defined ones:
    if (typeof properties === "undefined") {
        properties = object;
    }
    // Loop trough the properties
    for (var property in properties) {
        if (properties.hasOwnProperty(property)) {
            // Make property read-only
            Object.defineProperty(object, property, {
                value: properties[property],
                writable: false,
                configurable: false,
                enumerable: false
            });
        }
    }
    return object;
}

var someObject = {};

blockProperties(someObject, {
    propertie1: "someValue",
    propertie2: "someOtherValue"
});

someObject.propertie1 = "this doesn't change anything";

console.log(someObject.propertie1); // Output: "someValue"

// Because "window" is also an object, you can set an only-read global var:
blockProperties(window, {
    onlyReadVariable: "onlyReadValue"
});
0 голосов
/ 03 ноября 2012

Я согласен с ответом и хотел бы отметить, что некоторые JavaScript-фреймворки, такие как 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.

Однако, если у вас есть особые потребности в отношении свойства, такие как особые потребности реализации метода доступа get, то лучше определить функцию, которая получает значение по мере необходимости.

- Тенгиз

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...