JavaScript: отключить переписывание методов объекта - PullRequest
0 голосов
/ 21 апреля 2011

Есть ли способ отключить переписывание методов на объектах javascript?

Например:

var myObj=new Object();
myObj.doSomething=function(){
 alert("good message")
}

myObj.doSomething=function(){
 alert("bad message")
}

myObj.doSomething(); // I want to alert me with "good message"

Я думаю, что это можно сделать, потому что я хотел переписать методНесколько лет назад, и я получил сообщение об ошибке в консоли javascript о том, что метод только получить, а не установить.

Спасибо

Ответы [ 3 ]

3 голосов
/ 21 апреля 2011

В ECMAScript 5 вы можете установить объекты равными неизменяемым :

Object.freeze(myObj);

Вы можете создать отдельное свойство, которое нельзя изменить, используя:

Object.createProperty(myObj, 'name', descriptor);

, где descriptor сам по себе является объектом, содержащим флаги , одним из которых является configurable, который, если задано значение false, предотвращает изменение или удаление этого свойства.

0 голосов
/ 21 апреля 2011

Хотя у Alnitak есть хороший прямой ответ на ваш вопрос, в зависимости от того, чего вы пытаетесь достичь, вы можете предотвратить «переписывание» метода, сделав его «закрытой» переменной через замыкание.Он не защищает «публичные» функции, но может скрывать приватные функции и предотвращать их изменение.

var myObj = (function(){
    var data = {count: 0};
    var privateFunction1 = function(){
      data.count++;
    };

    var privateFunction2 = function(){
      // do something else
    };

    var result = {
        callPrivateFunction: function(){
            privateFunction();
            privateFunction2();
        }
    };

    return result;
})();

Конечно, любая публичная функция, которая вызывает приватную функцию, может быть перезаписана, поэтому в зависимости отто, что вы пытаетесь достичь, может просто вызвать проблему.Тем не менее, этот подход является хорошим способом для выполнения некоторой инкапсуляции и не предоставляет в API объекта больше, чем вы хотите.

0 голосов
/ 21 апреля 2011

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

Это и благословение, и проклятие.

Если вы столкнулись с этим сообщением об ошибке, скорее всего, это (а) ошибка в реализации JavaScript / JScript, или (б) не то, что вы думали.

ИЗМЕНЕНО: ВозможноВы смотрели на код ECMAScript 5.Я поддерживаю ECMAScript 3 так долго, что у меня, по-видимому, развилась катаракта, которая не дает мне такой возможности.Прости меня.Я смиренно стою в исправленном состоянии.

...