首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >javascript final方法

javascript final方法
EN

Stack Overflow用户
提问于 2011-04-27 05:59:47
回答 3查看 3.8K关注 0票数 2

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-27 06:30:43

在传统意义上,不能,你不能有私有/受保护的方法,也不能防止它们被覆盖。

但是,您可以做的是将方法封装在作用域中,然后简单地不公开它们:

代码语言:javascript
复制
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%跨浏览器的。

代码语言:javascript
复制
var x = {};
x.__defineGetter__('foo', function(){ return 10; });
x.__defineSetter__('foo', function(){});

x.foo = 'bar';
x.foo; // 10
票数 6
EN

Stack Overflow用户

发布于 2011-04-27 06:27:31

你可以使用defineProperty来保护你想要保护的成员。

Mike提到了防止重定义的configurable属性-- delete。我也添加了这个。

代码语言:javascript
复制
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中的所有成员。

代码语言:javascript
复制
var obj = { foo: "bar" };
obj = Object.freeze(obj);

obj.foo = ""; // output is empty
obj.foo // output is still "bar".
票数 6
EN

Stack Overflow用户

发布于 2011-04-27 06:03:00

据我所知,该语言没有强制对象属性的终结性的方法。你必须在你的一端强制执行这一点。“相当确定”的一种方法是使用一个极不可能在子类中使用的命名约定。就像这样

代码语言:javascript
复制
someobject.__property__

可能会工作得很好。另一种选择是使用hasOwnProperty()函数来检测父对象是否已经有了属性,然后再用其他内容覆盖它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5796981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档