有没有办法禁用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而不是设置的错误。
由于
答案 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中没有比你想要的更多。