標籤:style blog io color ar os 使用 java sp
JavaScript中的每個函數都是一個對象。
因為函數都是對象,它們有自己的屬性和方法。我們可以把它們看作資料(data)。
函數和方法的區別?
函數立足於它們自己(例如:alert()),
而方法是函數內部一個對象的屬性(dictionary),我們通過對象來調用方法。
每個JavaScript函數都會有很多附屬的(attached)方法,包括toString()、call()以及apply()。
定義了一個全域函數f()。f()通過this關鍵字訪問變數x,
var x = 10;function f(){ alert(this.x);}f();
function p(){
var x=100;
alert(x);
}
p();
注意:我們不能通過一個對象的執行個體來調用這個函數。
this指向的是什麼對象呢?this會指向這個全域對象。我們的變數x就是在這個全域對象中定義的。
上面的代碼能夠正常運行,運行結果會顯示一個對話方塊,對話方塊中顯示10。 第二個函數 輸出100,函數內部屬性
js裡call函數改變對象指標,指向另一個對象調用
var x = 10;var o = { x : 15};function f(){ alert(this.x);}f();f.call(o);
首先調用f()將會顯示10的對話方塊,因為this這個時候指向的是全域對象。
然後我們調用f函數的call()方法,傳入的參數是o,運行結果顯示的是o中x屬性的值15。
call()方法會用它的第一個參數作為f函數的this指標。也就是說,我們會告訴運行時,f函數中的this指向的是哪個對象。
call傳入參數
<script type="text/javascript"> var x = 10;var o = { x : 15};function f(y){ alert(this.x); this指O對象 alert(y);}f.call(o,this.x); this指全域對象屬性10 </script>
<script language="javascript"><!-- /**定義一個animal類*/ function Animal(){ this.name = "Animal"; this.showName = function(){ alert(this.name); } } /**定義一個Cat類*/ function Cat(){ this.name = "Cat"; } /**建立兩個類對象*/ var animal = new Animal(); var cat = new Cat(); animal.showName.call(cat,",");
//通過call或apply方法,將原本屬於Animal對象的showName()方法交給當前對象cat來使用了。 //輸入結果為"Cat"
</script>
call函數實現對象繼承
<script language="javascript"><!-- function Class1() { this.showTxt = function(txt) { alert(txt); } } function Class2() { Class1.call(this); } var c2 = new Class2(); c2.showTxt("cc"); </script>
c2對象可以具有了 Class對象的所有方法
apply()函數
對於apply和call兩者在作用上是相同的,但兩者在參數上有區別的。
對於第一個參數意義都一樣,但對第二個參數:
apply傳入的是一個參數數組,也就是將多個參數組合成為一個數組傳入,而call則作為call的參數傳入(從第二個參數開始)。
如 func.call(func1,var1,var2,var3)
對應的apply寫法為:func.apply(func1,[var1,var2,var3])
JS函數與call()apply()詳解