javascript 中對象的繼承〔轉貼〕
2024-09-06 12:43:41
供稿:網友
1、關于javascript的apply和call函數
prototype.js中用了大量的apply和call函數,不注意會造成理解偏差。
官方解釋:應用某一對象的一個方法,用另一個對象替換當前對象。
apply與call的區別是第二個參數不同。apply是 數組或者arguments 對象。而call是逗號隔開的任何類型。
apply,call方法最讓人混淆的地方也是apply,call的特色。但最好不要濫用。
能改變調用函數的對象。如下例,函數中用到this關鍵字,這時候this代表的是apply,call函數的第一個參數。
<script src="prototype1.3.1.js"></script>
<input type="text" id="myText" value="input text">
<script>
function Obj(){
this.value="對象!";
}
var value="global 變量";
function Fun1(){
alert(this.value);
}
window.Fun1();
Fun1.apply(window);
Fun1.apply($('myText'));
Fun1.apply(new Obj());
</script>
2、關于閉包
prototype.js在Class.create,bind等中用到javascript的閉包特色。但整體上prototype.js對于強大的閉包特性用的不多。大家可以參閱我翻譯的篇文章了解閉包。
3、讓我比較反感的兩個方法
(1)
var Class = {
create: function() {
return function() {
this.initialize.apply(this, arguments);
}
}
}
很討厭用別的語言的風格來寫javascript。用這個方法構造自定義類 并沒有覺得有多方便,減少代碼行數,只會讓人難理解,多定義一個initialize方法。
其實討厭這條有些牽強,不過修改Object的原型對象就有點過分了。
(2)Object.prototype.extend
先不過你取個extend的名字會讓熟悉java的人引起的歧義。修改Object的prototype就說不過去了。不知道作者是怎么考慮的。當你for in循環對象是,麻煩就來了。可能有人會問你for in干嗎。 我一個項目中既用了DWR,也用了prototype.js,dwr返回的javascript對象都多了個exetend屬性,還得特殊處理。
以前我比較過dojo和prototype.js中繼承的實現,現在我明白個道理。對于javascript這種沒有靜態類型檢查,語法寬松的語言來講,如果你選擇了某個js類庫,那你也必須適應作者寫javascript的風格。prototype.js的作者對extend的使用爐火純青,如果我們不當它只是個屬性拷貝的函數的話,多讀讀prototype.js的代碼是好的。
4、關于函數的綁定