2011-04-28 90 views
2

我在javascript中读取原型,我写了2个输出完全相同的小js代码。我只是想知道它们之间有什么区别:Javascript对象原型

代码1:

String.sam = function() { alert('fine') }; 
'ok'.sam(); 

代码2原型:

String.prototype.sam = function() { alert('fine') }; 
'ok'.sam(); 

请澄清的差异,更好的办法使用代码。

谢谢

回答

4

你的第一个例子不起作用。你在做什么是创建字符串对象的静态方法,所以你必须静态调用它

//OK 
String.sam(); 
//not OK, raises error 
'hello'.sam(); 

在第二个例子中,关键字this将把你怎么称呼它在弦上的实例。所以你可以做点像

String.prototype.sam = function() { 
    console.log(this.toUpperCase()); 
} 

'hello'.sam(); // HELLO 

这种技术虽然强大,但在某些方面却令人f目结舌。它被称为游击队补丁,猴子拳击或类似的东西。 有它被认为是不好的几个原因:

  • 难以调试(你已经改变了语言)
  • 易断裂是不知道页面上的其他代码已经更改了原型
  • 未来核心增强可能会发生冲突。
  • 也许其它更多
+0

自从你提到了所有涉及的陷阱之后,你能否在第二个例子中评论一个更好的选择?我试图把我的头围绕原型,并且很好奇。 – Chris 2011-05-27 23:17:47

0

我想,你的第一个方法只用于此特殊属性警报()方法添加。如果你想创建另一个实例,你必须再次做同样的事情。使用原型可以更一般地定义它,因此您不必为另一个实例再次执行相同的操作。

也许http://www.javascriptkit.com/javatutors/proto.shtml会帮助你更好地理解它。