2011-09-14 3 views
2

Я создал JavaScript "класс" следующим образом:Javascript - Отражая инкапсулированные члены

function MyClass(member1, member2) { 
    this.Member1 = member1; 
    this.Member2 = member2; 
} 

Все члены Strings.

Я хочу взять экземпляр MyClass и «чистых» членов по телефону

function NoneBecomesNull(item) { 
    if (item === "[None]") 
     item = ""; 
    return item; 
} 

для-каждого члена класса. Есть ли эффективный способ выполнить эту задачу? (В случае, когда MyClass имеет 30 членов).

Я хотел бы избежать этого ...

myClassInstance.Member1 = NoneBecomesNull(myClassInstance.Member1); 
myClassInstance.Member2 = NoneBecomesNull(myClassInstance.Member2); 
//...30+ times 
+2

JavaScript не является классом на основе объектно-ориентированного языка, это прототип на базе. Прекратите пытаться засунуть квадратное отверстие над круглым штифтом. – Incognito

ответ

4

Попробуйте следующее

for (var name in theObject) { 
    if (theObject.hasOwnProperty(name) && theObject[name] === "[None]") { 
    theObject[name] = ""; 
    } 
} 

Я использовал hasOwnProperty, чтобы предотвратить переустановку свойств выше в цепочке прототипов. В вашем примере не показано использование цепи прототипа здесь, и, следовательно, для этого примера это не обязательно. Но это хорошая практика.

+0

+1 Очень хороший ответ. Это прекрасно работает! –

+0

Не знаете, почему вы не хотели бы инкапсулировать это поведение ... похоже, что он загрязнит ваш код приложения. – jondavidjohn

+0

@ jondavidjohn - оба решения работают хорошо. Я выбрал JaredPar, потому что он сначала ответил на вопрос с помощью трудоспособного решения. Я дал вам +1 для улучшения. –

3

Почему бы вам не инкапсулировать это поведение внутри вашего объекта?

WORKING EXAMPLE

function MyClass(member1, member2) { 
    this.Member1 = member1; 
    this.Member2 = member2; 
    this.clean = function() { 
     for (var member in this) { 
      if (this.hasOwnProperty(member) && this[member] === "[None]") { 
       this[member] = ""; 
      } 
     } 
    }; 
} 

Затем он принимает только одну строку для выполнения ...

var obj = new MyClass("[None]", "hello"); 

obj.clean(); 
+1

Я считаю, что OP хочет сбросить элементы со значением '' [None] "'. Здесь вы сбрасываете каждый член – JaredPar

+1

нет, потому что проверка выполняется внутри функции, которую он предоставил 'NoneBecomesNull', который я изменил на' Empty', чтобы быть более точным – jondavidjohn

+0

Это не будет полностью работать, потому что функция устанавливает аргумент, а не оригинал член. – pimvdb

Смежные вопросы