这个特定的构造有名称吗?

时间:2011-02-14 10:32:08

标签: javascript functional-programming

例如:

function foo() {
    var bar = this.bar = function () {
        return "bar";
    };
    this.mybar = function () {
        return bar();
    }
}
var myFoo = new foo();
myFoo.bar = function() {
    return "notbar";
};
myFoo.bar(); // returns 'notbar'
myFoo.mybar(); // returns "bar"

基本上它允许封闭的内部私有方法,可能只被外部访问覆盖。因此,对于闭包内该函数的引用,对原始函数的引用永远不会改变。但是闭包对象的实例化器可以覆盖该函数而不会破坏对象的功能。

这个特定的构造是否有名称,它甚至有用吗?

1 个答案:

答案 0 :(得分:3)

如果您指的是将函数分配给局部变量并在另一个公共方法中使用此函数,那么是的,这将是某种形式的数据封装。除此之外,我会说没有特别的名字。
var bar是函数的局部变量,this.bar是新对象的属性。变量和属性碰巧具有相同的名称,但它们不相关。

仅在您bar公开访问该功能并确保其他功能正常工作时才有用,以防公共bar被覆盖。

所以这是保护其他功能的某种形式,但它不是允许外部覆盖的特殊模式。

如果this.bar的唯一目的是被覆盖,那么你就可以实现同样目的:

function foo() {
    var bar = function () {
        return "bar";
    };
    this.mybar = function () {
        return bar();
    }
}
var myFoo = new foo();
myFoo.bar = function() {
    return "notbar";
};
myFoo.bar(); // returns 'notbar'
myFoo.mybar(); // returns "bar"

当然,如果您在为其分配功能之前致电myFoo.bar(),那么您将收到错误。