1. 程式人生 > >javascript中call方法詳解

javascript中call方法詳解

轉載自http://www.cnblogs.com/sweting/archive/2009/12/21/1629204.html
應用於:Function 物件 
要求 
版本 5.5 
呼叫一個物件的一個方法,以另一個物件替換當前物件。 

call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 
引數 
thisObj 
可選項。將被用作當前物件的物件。 
arg1, arg2, , argN 
可選項。將被傳遞方法引數序列。 
說明 
call 方法可以用來代替另一個物件呼叫一個方法。call 方法可將一個函式的物件上下文從初始的上下文改變為由 thisObj 指定的新物件。 

如果沒有提供 thisObj 引數,那麼 Global 物件被用作 thisObj。 

------------------------------------------------------------------------------------------- 
乍一看,很容易把人看迷胡,先做一些簡單的說明 
obj1.method1.call(obj2,argument1,argument2) 
如上,call的作用就是把obj1的方法放到obj2上使用,後面的argument1..這些做為引數傳入. 

舉一個具體的例子 
function add(a,b) 

    alert(a+b); 

function sub(a,b) 

    alert(a-b); 


add.call(sub,3,1); 

這個例子中的意思就是用 add 來替換 sub,add.call(sub,3,1) == add(3,1) ,所以執行結果為:alert(4); // 注意:js 中的函式其實是物件,函式名是對 Function 物件的引用。 


看一個稍微複雜一點的例子 

function Class1() 

    this.name = "class1"; 

    this.showNam = function() 
    { 
        alert(this.name); 
    } 


function Class2() 

    this.name = "class2"; 


var c1 = new Class1(); 
var c2 = new Class2(); 

c1.showNam.call(c2); 

注意,call 的意思是把 c1 的方法放到c2上執行,原來c2是沒有showNam() 方法,現在是把c1 的showNam()方法放到 c2 上來執行,所以this.name 應該是 class2,執行的結果就是 :alert("class2"); 

怎麼樣,覺得有意思了吧,可以讓a物件來執行b物件的方法,這是java程式設計師所不敢想的。還有更有趣的,可以用 call 來實現繼承 

function Class1() 

    this.showTxt = function(txt) 
    { 
        alert(txt); 
    } 


function Class2() 

    Class1.call(this); 


var c2 = new Class2(); 

c2.showTxt("cc"); 

這樣 Class2 就繼承Class1了,Class1.call(this) 的 意思就是使用 Class1 物件代替this物件,那麼 Class2 中不就有Class1 的所有屬性和方法了嗎,c2 物件就能夠直接呼叫Class1 的方法以及屬性了,執行結果就是:alert(“cc”); 

對的,就是這樣,這就是 javaScript 如何來模擬面向物件中的繼承的,還可以實現多重繼承。 

function Class10() 

    this.showSub = function(a,b) 
    { 
        alert(a-b); 
    } 


function Class11() 

    this.showAdd = function(a,b) 
    { 
        alert(a+b); 
    } 



function Class2() 

    Class10.call(this); 
    Class11.call(this); 


很簡單,使用兩個 call 就實現多重繼承了 
當然,js的繼承還有其他方法,例如使用原型鏈,這個不屬於本文的範疇,只是在此說明call 的用法 
說了call ,當然還有 apply,這兩個方法基本上是一個意思 
區別在於 call 的第二個引數可以是任意型別,而apply的第二個引數必須是陣列

相關推薦

javascriptcall方法

轉載自http://www.cnblogs.com/sweting/archive/2009/12/21/1629204.html 應用於:Function 物件  要求  版本 5.5  呼叫一個物件的一個方法,以另一個物件替換當前物件。  call([thisObj[,arg1[, arg2[, [,.

JavaScriptgetBoundingClientRect()方法

script otto java chrome 頁面 支持 urn client fire getBoundingClientRect() 這個方法返回一個矩形對象,包含四個屬性:left、top、right和bottom。分別表示元素各邊與頁面上邊和左邊的距離。

Array.prototype.slice.call()方法 (調用方法的參數截取出來)

post name push matlab methods typeof eof prot 並不是 在很多時候經常看到Array.prototype.slice.call()方法,比如Array.prototype.slice.call(arguments),下面講一下其原

前端學習筆記之jsapply()和call()方法

經過網上的大量搜尋,漸漸明白了apply()和call方法的使用,為此寫一篇文章記錄一下。 定義 apply()方法: Function.apply(obj,args)

JavaScript的this

定律 htm uid js代碼 tdd ati tom dmr doctype 前言 this用法說難不難,有時候函數調用時,往往會搞不清楚this指向誰?那麽,關於this的用法,你知道多少呢? 下面我來給大家整理一下關於this的詳細分析,希望對大家有所幫助!

javascriptcall()方法的理解

創建 scrip 補充 call() 函數對象 指定 指針 com fin call ( thisObj [, arg1 [, arg2 [, [, argN] ] ] ]) call()方法:官方介紹是,調用一個對象的一個方法,以另一個對象替換當前對象。      ca

boost庫sleep方法

seconds boost庫 color sys 在線 TP 方法 轉載 details 博客轉載自:https://blog.csdn.net/huang_xw/article/details/8453506 boost庫中sleep有兩個方法: 1. 這個方法只能在線程

Javascriptcall()方法和apply()方法的作用與區別

形式 時速 有效 let 調用函數 ply lane pan arguments ECMAScript規範所有函數都包含兩個非繼承的方法,分別為call()和apply(),這兩個函數都是在特定的作用域中調用函數,能改變函數的作用域,實際上是改變函數體內“t

javascriptnew關鍵字

nbsp pan cnblogs undefined 百度地圖 實例 code undefine tro 和其他高級語言一樣 javascript 中也有 new 運算符,我們知道 new 運算符是用來實例化一個類,從而在內存中分配一個實例對象。 但在 javascript

JS陣列方法

JS中陣列的方法有很多,但是自己一直沒有抽時間進行整理分類,故單獨寫一篇博文,對目前我所掌握的JS中陣列相關的方法進行整理,夯實一下自己的基礎。 我將陣列相關的方法分為兩類 1.方法會改變原陣列 相應的方法有:shift、unshift、pop、push、rev

Java 的Stringintern方法及測試樣例

intern public String intern() 返回字串物件的規範化表示形式。 一個初始時為空的字串池,它由類 String 私有地維護。 當呼叫 intern 方法時,如果池已經包含一個等於此 String 物件的字串(該物件由 equals(Obj

js apply和js call方法

js apply和js call方法總是讓初學者困惑,下文就apply和call的區別,什麼情況下用apply,什麼情況下用call、apply的巧妙用法來闡述js apply和js call方法的詳細使用方法。 主要我是要解決一下幾個問題: 1.   app

pythonlist方法說明

序號 分類 關鍵字/函式/方法 描述 1 新增 list.insert(索引,資料) 在指定位置插入資料     list.append(資料)

javacompareTo方法

Compares two strings lexicographically. The comparison is based on the Unicode value of each character in the strings. The character sequence represented

Spring4.0MVC學習資料,ApplicationContext方法(三)

做為java開源的一部分,spring框架一直排在老大的位置。Spring4.0 是 Spring 推出的一個重大版本升級,進一步加強了 Spring 作為 Java 領域第一開源平臺的地位。Spring4.0 引入了眾多 Java 開發者期盼的新特性,如泛型依賴注入、Sp

pythonnew方法

new_ 方法是什麼? __new__方法其實就是建立物件的方法 new()方法是在類準備將自身例項化時呼叫。 一個類可以有多個位置引數和多個命名引數,而在例項化開始之後,在呼叫 init()方法之前,Python首先呼叫new()方法: def new(cls, *args, **kw

PHP迴圈二維陣列 。php__autoload()方法

PHP迴圈二維陣列   PHP程式碼: <?php $arr1=array(100,200,300,400); $arr2=array("num"=>100,"name"=>"Liuxy","score"=>98); print_r($arr1); e

Pandasresample方法

Pandas中的resample,重新取樣,是對原樣本重新處理的一個方法,是一個對常規時間序列資料重新取樣和頻率轉換的便捷的方法。 方法的格式是: DataFrame.resample(rule, h

jsgetBoundingClientRect()方法

getBoundingClientRect獲取元素位置 getBoundingClientRect用於獲得頁面中某個元素的左,上,右和下分別相對瀏覽器視窗的位置。 getBoundingClientRect是DOM元素到瀏覽器可視範圍的距離(不包含文檔卷起

JavaScriptsetAttribute用法

setAttribute基本用法 element.setAttribute(attributename,attributevalue) setAttribute() 方法新增指定的屬性,併為其賦指定的值,看到w3c的例子 document.getElementsBy