Javascript对象原型

时间:2011-04-28 08:21:22

标签: javascript

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

代码1:

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

代码2原型:

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

请说明使用代码的不同之处和更好的方法。

由于

2 个答案:

答案 0 :(得分:4)

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

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

在第二个示例中,关键字this将引用您调用它的字符串实例。所以你可以做类似

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

'hello'.sam(); // HELLO

这种技术虽然强大但在某些方面令人不悦。它被称为Guerrilla补丁,猴子打孔或类似的东西。 有几个原因被认为是坏事:

  • 难以调试(您已更改语言)
  • 很容易破坏页面上的其他代码,这些代码不知道您已经改变了原型
  • 未来核心增强可能发生冲突。
  • 可能还有更多

答案 1 :(得分:0)

我认为,您的第一个方法仅为此特殊属性添加了alert()方法。如果要创建另一个实例,则必须再次执行相同的操作。使用protoype,你可以更普遍地定义它,这样你就不必再为另一个实例做同样的事了。

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