2010-02-05 124 views
1

我一直在學習更多關於JavaScript的原型繼承。我知道關於是否擴展本地對象存在着一場激烈的爭論,我想在這個問題上全面辯論整個辯論。在javascript中擴展後代對象

是否有可能在JavaScript中只擴展後代對象?

延長所有對象我可以這樣做:

Object.prototype.size = function(){ 
     var length = 0; 
     for(var i in this){ 
      if(this.hasOwnProperty(i)){ 
       length++; 
      } 
     } 
     return this; 
} 

但問題是,它擴展的所有對象。我想要做的是這樣的:

var MyNameSpace = function(){ 

}; 

MyNameSpace.Object.prototype.size = function(){ 
    var length = 0; 
    for(var i in this){ 
     if(this.hasOwnProperty(i)){ 
      length++; 
     } 
    } 
    return this; 
} 

這樣我只會擴展我的全局對象範圍內的本地對象。

任何建議將是巨大的感謝

更新:
在迴應一些評論,我加入了更多的代碼來澄清我想要做的事。

我想我可能沒有正確表述我的問題,也許我的想法是不正確的,但我希望能夠做到的是:

 

    var my = new MyNameSpace(); 
    var my.name = {firstName : 'Hello', lastName : 'World'}; 
    var nameCount = my.name.size(); // 2 
 

您提供的代碼將允許我讓每個myNameSpace對象對象創建的大小,而不是字面對象屬於myNameSpace對象對象的屬性

+0

你可以使用自己的對象來建立其他... – Anonymous 2010-02-05 05:59:02

回答

1

你可以使用「僞古典」風格的繼承來實現它:

var MyNameSpace = function() { 
    this.v1 = null; 
    this.v2 = null; 
} 

MyNameSpace.prototype.size = function() { 
    var length = 0; 
    for(var i in this){ 
    if(this.hasOwnProperty(i)){ 
     length++; 
    } 
    } 
    return this; 
} 

var my = new MyNameSpace(); // create new object based on MyNameSpace 
my.size(); // length would be 2 

您在函數對象的prototype上定義的內容將被所有通過new運算符創建的函數對象繼承。

更新代碼,根據您的要求添加,

var obj = {}; 

var MyNameSpace = function(props) { 
    for(var name in props) { 
    this[name] = props[name]; 
    } 
} 

MyNameSpace.prototype.size = function() { 
    var length = 0; 
    for(var i in this){ 
    if(this.hasOwnProperty(i)){ 
     length++; 
    } 
    } 
    return this; 
} 

obj.name = new MyNameSpace({firstName : 'Hello', lastName : 'World'}); 
obj.name.size(); // length would be 2 
+0

感謝您的答覆。我在第一篇文章中添加了更多內容來澄清 – iangraham 2010-02-05 06:17:38

0

在你的代碼

var my = new MyNameSpace(); 
var my.name = {firstName : 'Hello', lastName : 'World'}; 
var nameCount = my.name.size(); // 2 

my.name顯然是從my穿越,但相反的是不正確的。這意味着無法從my.name訪問my的屬性,並且my無法在my.name的原型鏈中找到。如果你不想直接從MyNameSpace繼承,你必須明確地「掛上」你想要繼承的任何函數。

你可以做

my.name.size = my.size; 

或者(而不必實例化了myNameSpace):

my.name.size = MyNameSpace.prototype.size; 

如果你只有很少的功能,以 「繼承」。或者你可以在myNameSpace對象如下定義繼承功能:

MyNameSpace.prototype.addToNameSpace = function(obj) { 
    obj.size = this.size; 
    // obj.propertyI = this.propertyI, etc. 
} 

請注意,我不使用for..in這裏,將添加addToNameSpace功能以及。

希望這會有所幫助