在javascript中扩展后代对象

时间:2010-02-05 05:39:21

标签: 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对象属性的对象文字

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

在您的代码中

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

my.name显然可以从my遍历,但事实恰恰相反。这意味着无法从my访问my.name的属性,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功能。

希望这有帮助