2011-12-12 54 views
3

基本上,我想知道如何/對象的實例上的方法重寫/添加方法與JS對象的'類'實例上的方法有什麼區別(是類不是正確的字,不知道是什麼)。Javascript覆蓋/添加到原型的方法

例如,爲什麼不能正常工作?

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/

回答

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,這應該澄清你的一些困惑。

+0

謝謝......我有一個主要的java/.net背景,我懷疑這是沿着這些線的東西,但並沒有真正知道正確的方式來說問題/搜索關於JavaScript。 – tad604

0

您調用靜態Date對象,而不是它的構造函數。從MDN

調用在非構造上下文的JavaScript日期(即,不 新的運營商)將返回一個表示當前時間的字符串。

試試這個http://jsfiddle.net/fMWKA/4/

+0

不太...'Date.now()'是一個簡單的靜態方法。 –

0

真是M唔唔唔唔說的。 僅用於教育目的,您可以創建Date的新實例,並因此使用原型中聲明的方法。

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

http://jsfiddle.net/n9h4y/