javascript中的方法可以是最终的吗? 如何避免它被子类覆盖?
答案 0 :(得分:6)
您可以使用defineProperty来确保您想要保护的成员。
Mike提到了configurable
属性以防止重新定义 - 删除。我也加了这个。
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。但它确保了所有成员的对象。
var obj = { foo: "bar" };
obj = Object.freeze(obj);
obj.foo = ""; // output is empty
obj.foo // output is still "bar".
答案 1 :(得分:6)
在传统意义上,不,你不能拥有私人/受保护的方法或阻止它们被覆盖。
然而,您可以做的是将方法封装在范围内,然后根本不公开它们:
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
答案 2 :(得分:1)
据我所知,该语言没有办法强制执行对象属性的最终结果。你必须在你的最后强制执行。 “非常肯定”的一种方法是使用极不可能在子类中使用的命名约定。
之类的东西someobject.__property__
可能会很好用。另一种选择是使用hasOwnProperty()函数来检测父对象是否已经具有属性,然后再用其他东西覆盖它。