2010-02-05 5 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; 
} 

Таким образом, я бы простирающимся только родные объекты в рамках моего глобального объекта.

любые предложения будут большое спасибо

Update:
В ответ на несколько замечаний, я добавляю больше кода, чтобы разъяснить, что я пытаюсь сделать.

Я думаю, что я, возможно, не сформулировал свой вопрос правильно, или, может быть, мое мышление неправильно, но то, что я хотел бы быть в состоянии сделать это:

 

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

код вы предоставили мне позволит чтобы размер каждого объекта MyNameSpace я создаю, но не объектные литералы, которые являются свойствами объекта MyNameSpace

+0

Вы могли бы просто использовать свой собственный объект, из которого строить другие ... – Anonymous

ответ

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

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, а также.

Надеется, что это помогает