2011-02-14 70 views
1

在例如:這個特定的構造是否有名稱?

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" 

基本上它允許對內部專用方法來封閉,與被重寫僅用於外部訪問的可能性。所以對原始函數的引用永遠不會改變,以便在閉包內引用該函數。但是閉包對象的實例化器可以覆蓋該函數而不會破壞對象的功能。

這個特殊結構有沒有名稱,它有用嗎?

+0

更多看起來像一個JavaScript的怪癖。 – ulidtko 2011-02-14 10:39:14

回答

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()分配給它的功能之前,那麼你會得到一個錯誤。