javascript最终方法

ram*_*lla 2 javascript oop final

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

cem*_*cem 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.
Run Code Online (Sandbox Code Playgroud)

另外一个选项

Object.freeze.但它确保了所有成员的对象.

var obj = { foo: "bar" };
obj = Object.freeze(obj);

obj.foo = ""; // output is empty
obj.foo // output is still "bar".
Run Code Online (Sandbox Code Playgroud)


Mar*_*ahn 6

在传统意义上,不,你不能拥有私有/受保护的方法或阻止它们被覆盖.

但是,您可以做的是将方法封装在范围内,然后不公开它们:

function foo(){
    function bar(){
        // private function
    }

    this.doSomething = function(){
        bar();
    }
}
Run Code Online (Sandbox Code Playgroud)

那就是你能得到的尽可能接近.我刚才写了一篇文章: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
Run Code Online (Sandbox Code Playgroud)