2010-02-05 67 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功能以及。

希望这会有所帮助