javascript:禁用重写对象方法

时间:2011-04-21 18:20:15

标签: javascript methods rewrite

有没有办法禁用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控制台中收到一个关于该方法只有get而不是设置的错误。

由于

3 个答案:

答案 0 :(得分:3)

在ECMAScript 5中,您可以将对象设置为unmodifiable

Object.freeze(myObj);

您可以使用以下命令创建无法修改的单个属性:

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

其中descriptor本身是object containing flags,其中一个是configurable,如果设置为false,则会阻止该属性被更改或删除。

答案 1 :(得分:0)

JavaScript围绕着可以更改任何的概念而设计。您可以在任何时覆盖任何任何地方的功能。

这既是一种祝福,也是一种诅咒。

如果遇到该错误消息,可能是(a)JavaScript / JScript实现中的错误,或者(b)不是您认为的错误。

AMMENDED:您可能正在查看ECMAScript 5代码。我一直在维持ECMAScript 3这么长时间以来我显然已经开发了白内障,让我无视这种可能性。原谅我。我谦卑地纠正了。

答案 2 :(得分:0)

虽然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中没有比你想要的更多。