Javascript覆盖/添加原型的方法

时间:2011-12-12 18:51:04

标签: javascript

基本上,我想知道对象实例的覆盖/添加方法与JS对象的“Class”实例上的方法之间的区别是什么/是什么区别(是的类不是正确的单词,不确定是什么)

例如,为什么这不起作用?

Date.prototype.now= function (){
    return 23;
}

$('#foo').append(Date.now());    

但是,这样做了吗?

Array.prototype.indexOf = function(){
    return 23;
}
var bar = Array();
bar[0] = "a";
$('#bar').append(bar.indexOf("a"));

http://jsfiddle.net/tad604/fMWKA/2/

3 个答案:

答案 0 :(得分:4)

now is a static method on Date。它不是实例方法;在Date.prototype上没有定义。它直接在Date对象上定义。当你写

Date.prototype.now = function () {
    return 23;
}

你实际上并没有覆盖Date.now()调用的函数。


另一方面,indexOf for arrays is an instance method.也就是说,它是在Array.prototype上定义的,所以在你写的时候

Array.prototype.indexOf = function(){
    return 23;
};

实际上你正在改变

所调用的indexOf函数
var bar = [];
bar.indexOf('a');

看到区别? http://jsfiddle.net/mattball/7qVQy/


我建议阅读JavaScript prototype lookup chain,这应该澄清一些你的困惑。

答案 1 :(得分:0)

您正在调用静态Date对象而不是它的构造函数。来自MDN

  

在非构造函数上下文中调用JavaScript Date(即,没有   new运算符)将返回表示当前时间的字符串。

请改为http://jsfiddle.net/fMWKA/4/

答案 2 :(得分:0)

真正的MДΓΓБДLL所说的。 仅出于教育目的,您可以创建Date的新实例,因此使用原型中声明的方法。

Date.prototype.now = function() {
  return 23;
}
Date = new Date();
document.write(Date.now());

http://jsfiddle.net/n9h4y/