TAG

首都機能移轉 (2) 歌詞 (2) 靠北文 (40) 戲言 (30) 糟糕 (7) ACG (23) Assembly (2) Boost (2) C (31) C++ (69) CMake (4) CSIE (67) Debian (34) Design_Pattern (2) Django (1) Eclipse (1) en_US (13) FFmpeg (3) FoolproofProject (26) FreeBSD (2) Git (4) GNU_Linux (65) IDE (5) Java (11) JavaScript (19) KDE (15) Khopper (16) KomiX (3) Kubuntu (18) Life (1) Lighttpd (2) Mac_OS_X (2) Opera (1) PHP (2) PicKing (2) Programing (21) Prolog (1) Python (7) QSnapshot (2) Qt (30) Qt_Jambi (1) Regular_Expression (1) Shell_Script (7) Talk (98) VirtualBox (7) Visual_Studio (13) Windows (18) zh_TW (36)

2008年2月20日 星期三

instance or literal

前陣子在做JavaScript的異常處理時,意外的發現一些實體判定的問題。
考慮如下的程式:
try {
    throw( 'Exception' );
} catch( e if e instanceof String ) {
    alert( e );
}
這樣是不會捕捉到異常的,就算'Exception'這個字串可以使用String的method,就算typeof的取值是string。
接著再進一步的試驗:
var temp = [ 'test', String( 'test' ), new String( 'test' ) ];

for( var x in temp ) {
    alert( temp[x] + ', ' + typeof( temp[x] ) + ', ' + ( temp[x] instanceof String ) );
}

// test, string, false
// test, string, false
// test, object, true
可以看見只有用new才會真正用constructor建造一個實體,不加new的話似乎只是呼叫function而已。
也就是說new運算子才是產生instance,其他的都算literal。
可是要說instance和literal不一樣嗎?好像也不盡然:
String.prototype.popup = function() {
    alert( this );
};

// will alert 'test'
'test'.popup();

沒有留言:

張貼留言