2011-09-14 25 views
2

我创建了一个JavaScript的 “类”,如下所示:使用Javascript - 反射封装构件

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

所有成员都是字符串。

我想通过调用

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

换每个类的成员采取MyClass的和“干净”的成员的一个实例。有没有一种有效的方法来完成这项任务? (在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