javascript中的方法可以是final吗?如何避免它被子类覆盖?
发布于 2011-04-27 06:30:43
在传统意义上,不能,你不能有私有/受保护的方法,也不能防止它们被覆盖。
但是,您可以做的是将方法封装在作用域中,然后简单地不公开它们:
function foo(){
function bar(){
// private function
}
this.doSomething = function(){
bar();
}
}这差不多是你能得到的最接近的结果了。不久前我写了一篇关于这方面的文章:http://www.htmlgoodies.com/primers/jsp/article.php/3600451/Javascript-Basics-Part-8.htm
你也可以使用__defineGetter__和__defineSetter__来阻止访问,但它们不是100%跨浏览器的。
var x = {};
x.__defineGetter__('foo', function(){ return 10; });
x.__defineSetter__('foo', function(){});
x.foo = 'bar';
x.foo; // 10发布于 2011-04-27 06:27:31
你可以使用defineProperty来保护你想要保护的成员。
Mike提到了防止重定义的configurable属性-- delete。我也添加了这个。
function final(obj, members) {
for (var i = 0; i < members.length; i++) {
var m = members[i];
if (obj.hasOwnProperty(m)) {
Object.defineProperty(obj, m, {
value: obj[m],
writable: false,
configurable: false
});
}
}
return obj;
}
var obj = { foo: "bar" };
obj = final(obj, ["foo"]);
obj.foo = ""; // output will be empty but
obj.foo // now output's still bar.另一种选择
Object.freeze。但它保护了object中的所有成员。
var obj = { foo: "bar" };
obj = Object.freeze(obj);
obj.foo = ""; // output is empty
obj.foo // output is still "bar".发布于 2011-04-27 06:03:00
据我所知,该语言没有强制对象属性的终结性的方法。你必须在你的一端强制执行这一点。“相当确定”的一种方法是使用一个极不可能在子类中使用的命名约定。就像这样
someobject.__property__可能会工作得很好。另一种选择是使用hasOwnProperty()函数来检测父对象是否已经有了属性,然后再用其他内容覆盖它。
https://stackoverflow.com/questions/5796981
复制相似问题