天天看點

javascript的面向對象(轉)

initialize是什麼? 

隻不過是個變量,代表一個方法,用途是類的構造函數。 

看代碼:

代碼如下:

var classname = function(v){ 

    this.value=v; 

    this.getvalue=function(){ 

        return this.value; 

    } 

    this.setvalue=function(v){ 

        this.value=v; 

}

那麼js中的函數和類有什麼不同呢? 

其實是一樣的,classname就是一個函數,當出現在new後面的時候就作為一個構造函數來構造對象。 

var objectname1 = new classname(“a”);//得到一個對象

其中objectname1就是執行classname構造函數後得到的對象,而在classname函數中的this指的就是new之後構造出來的對象,是以objectname1會後一個屬性和兩個方法。可以通過這樣來調用他們:

objectname1.setvalue(''hello''); 

alert(objectname1.getvalue());//對話框hello 

alert(objectname1.value) ;//對話框hello

那麼

複制代碼 代碼如下:

var objectname2 = classname(“b”);//得到一個對象

這樣objectname2得到的是什麼呢?顯然是方法的傳回值,這裡classname隻作為了一個普通的函數(雖然首字母大寫了)。但是在之前寫的classname中并沒有傳回值,是以objectname2會是undifinded那麼“b”賦給誰了呢?在這并沒有産生一個對象,而隻是單純的執行這個方法,是以這個“b”指派給了調用這個方法的對象window,證據如下: 

var objectname2 = classname(“b”);//得到一個對象 

alert(window.value);//對話框b 

是以js中的所有function都是一樣的,但是用途可能是不同的(用作構造對象抑或是執行一個過程)。 

下面該回到主題了initialize是幹什麼的?

var class = { 

    create: function() { 

        return function() { 

            this.initialize.apply(this , arguments); 

        } 

var a = class.create();

這段代碼是構造個一個function複制給a,這個function是

function() { 

    this.initialize.apply(this , arguments); 

并且後面這個方法是用來做構造函數的。當使用這個構造函數來構造對象的時候,會讓構造出來的這個對象的initialize變量執行apply()方法,apply()的用途後面在說,繼續說initialize。這樣在初始化對象的時候會聯系到initialize(怎麼聯系就要看apply的了)。 

a.prototype={ 

    initialize:function(v){ 

        this .value=v; 

    showvalue:function(){ 

        alert(this.value); 

是什麼意思呢? 

prototype是“原型”的意思。a是一個function(),那麼a. prototype,就是function中的一個變量,其實是個對象。這個對象擁有什麼方法,那麼function産生的對象就擁有什麼方法,故 

var a = new a(‘helloword!'); 

a. showvalue();//彈出對話框helloword!

是以a對象也會有initialize方法,不隻如此,每一個有a構造出來的對象都會有一個initialize方法,而在前面說過,構造的時候會調用構造函數,構造函數裡面會讓initialize去調用apply方法,于是在new a(‘helloword!')的時候initialize回去調用apply方法。這也就是調用了一個初始化的方法。

三、 call()和apply() 

下面開始研究apply(),在網上找了幾個資料,并結合自己的研究,了解了call()和apply()的功能。功能基本一樣,function().call(object,{},{}……)或者function().apply (object,[……])的功能就是對象object調用這裡的funciton(),不同之處是call參數從第二個開始都是傳遞給funciton的,可以依次羅列用“,”隔開。而apply隻有兩個參數,第二個是一個數組,其中存儲了所有傳遞給function的參數。 

this.initialize.apply(this , arguments); 

是什麼意思? 

這裡的第一個this,是指用new調用構造函數之後生成的對象,也就是前面的a,那麼第二個this也當然應該是指同一個對象。那這句話就是this(也就是a)調用initialize方法,參數是arguments對象(參數的數組對象),是以在構造函數執行的時候,對象a就會去執行initialize方法來初始化,這樣就和單詞“initialize”的意思對上了。 

那麼執行initialize方法的參數怎麼傳遞進去的呢?

四、 arguments對象 

這段代碼能說明一切了:

function test(){ 

    alert(typeof arguments); 

    for(var i=0; i<arguments.length; i++){ 

        alert(arguments[i]); 

test("1","2","3"); 

test("a","b");

執行後alert(typeof arguments);會顯示object,說明arguments是對象。然後會依次打出1、2、3。說明arguments就是調用函數的實參數組。

arguments 就是create傳回的構造函數的實參數組,那麼在 

的時候‘helloword!'就是實參數組(雖然隻有一個字元串),傳遞給方法apply,然後在調用initialize 的時候作為參數傳遞給初始化函數initialize。

繼續閱讀