很久之前就在用JavaScript了,只是用的比較表層,會寫幾個函數(shù)而已,也沒有深入的研究過。最近一段時間,由于項目的需要,看了一些關(guān)于JavaScript的書,也寫了不少的JavaScript的代碼,慢慢開始對這個東東著迷了。現(xiàn)在JavaScript在Web應(yīng)用中的比重越來越大,各種好用的庫也層出不窮,即使對JavaScript了解的比較淺顯,也可以利用各種利器做出很不錯的作品。但是,較為深入的了解一下JavaScript的特性,對于更熟練的使用它肯定還是有很大的幫助的。
JavaScript是一種基于原型(prototype-based)的語言,而Java是基于類(class-based)的語言。對于我這種先學(xué)習(xí)Java再學(xué)習(xí)JavaScript的人來說,總是會不自覺的用一些Java的概念去往JavaScript上套用。比如說,我就很想在JavaScript中使用類似Java中super.someMethod()。但是很多JavaScript的資料上最常見的寫法是:
someObject.prototype.someMethod = function(){…};
這樣就是完全改寫了父類的方法,是無法滿足需求的。
借助JavaScript中的apply或者call,就可以實現(xiàn)在子類中調(diào)用父類方法。
假設(shè)如下場景:根據(jù)不同的數(shù)據(jù)對生成的圖形進行不同形式的填充。父類負責生成基本的圖形,子類根據(jù)需求對父類生成的圖像進行填充。
代碼如下:
<html>
<head>
<meta content="text/html; charset=UTF-8"/>
<script type="text/javascript">
Shape = function() {
this.id = null;
this.picture = null;
this.draw = function(canvas){
this.picture = "由父類產(chǎn)生的圖像已經(jīng)生成在畫布上了";
};
};
CommonShape = function(){};
CommonShape.prototype = new Shape();
CrossFillShape = function(){
this.draw = function(canvas){
CrossFillShape.prototype.draw.apply(this, arguments);
this.picture = this.picture + ", 然后被子類 CrossFillShape 填充";
};
};
CrossFillShape.prototype = new Shape();
SolidFillShape = function(){
this.draw = function(canvas){
SolidFillShape.prototype.draw.apply(this, arguments);
this.picture = this.picture + ", 然后被子類 SolidFillShape 填充";
};
};
SolidFillShape.prototype = new Shape();
function test1() {
var s = new CommonShape();
s.draw();
console.debug(s.picture);
var cs = new CrossFillShape();
cs.draw();
console.debug(cs.picture);
var ss = new SolidFillShape();
ss.draw();
console.debug(ss.picture);
}
</script>
</head>
<body>
<input type="button" value="test1" onclick="test1()"/><br/>
</body>
</html>
(上面代碼中的console對象是Firefox的Firebug插件提供的,在這里為Firebug插件做個廣告,那是相當?shù)暮糜冒。。?/p>
這里通過apply來調(diào)用父類方法。
JavaScript中的apply和call
在JavaScript中,一個對象方法代碼中的this并不是一直指向這個對象,通過apply或者call就可以方便的切換this指向的方法。或者說,apply和call方法的最直接的作用就是切換this的指向,并由此可以引發(fā)很多非常靈活的用法(可以看看prototype庫的代碼,有很多apply和call)。apply和call的區(qū)別在于調(diào)用時參數(shù)傳入的方式不同:第一個參數(shù)都是對象指針(也就是說把原來代碼中的this指向哪個對象),apply的第二個參數(shù)是數(shù)組,call從第二個參數(shù)開始是實際的函數(shù)調(diào)用參數(shù)
可以用下面的式子表達:
foo.call(this, arg1,arg2,arg3) == foo.apply(this, arguments) == this.foo(arg1, arg2, arg3)
posted on 2010-04-29 20:43
YODA 閱讀(4956)
評論(1) 編輯 收藏