javascript最终方法

时间:2011-04-26 21:59:47

标签: javascript oop final

javascript中的方法可以是最终的吗? 如何避免它被子类覆盖?

3 个答案:

答案 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()函数来检测父对象是否已经具有属性,然后再用其他东西覆盖它。