在這篇博客里面談一談jsp函數的一些使用規則
1.在jsp里面,函數和類是等價的,因為在函數的內部可以定義函數和變量。定義在函數內的函數和變量分為實例屬性、實例函數、類屬性、類函數。實例和類是面向對象的概念
實例屬性是屬於單個對象的,所以必須通過實例對象來訪問。類屬性是屬於整個類的(也就是整個函數的),因此必須通過類(函數來訪問)。如果用實例對象的名字來訪問類屬性,那么將返回undefined,因為這樣就相當於為對象實例新增了一個和函數實例同名的屬性。雖然對象實例不能訪問類屬性,但是可以通過在定義對象的時候修改類屬性的值。
//類屬性和實例屬性的使用 function Person(national,age) { this.age = age; Person.national = national; var local_var;// } //創建第一個實例對象 var first = new Person('中國',19); with(document) { writeln("第一個對象的屬性:"+"<br>"); writeln("用對象名來調用屬性:"+first.age +" "+first.national+" "+first.local_var+"<br>"); writeln("用類名來調用屬性:"+Person.age+" "+Person.national+" "+Person.local_var+"<br>"); } //創建第二個實例對象 var second = new Person('美國',20); with(document) { writeln("第二個對象的屬性:"+"<br>"); writeln("用對象名來調用屬性:"+second.age +" "+second.national+" "+second.local_var+"<br>"); writeln("用類名來調用屬性:"+Person.age+" "+Person.national+" "+Person.local_var+"<br>"); } //創建第三個實例變量 var third = new Person('韓國',21); with(document) { writeln("再次調用類屬性:"+Person.national+"<br>"); }
2.jsp函數的獨立性
雖然jsp中的函數是屬於某個對象的,但是並不是只有函數所屬類的對象才能調用該函數,其他對象也能調用該函數。調用函數需要使用call()或者apply()方法。調用的語法為:函數名.call(調用對象,參數1,參數2...)。call()和apply()的不同點在於call()需要把函數的所有參數一個一個的列出來,而apply()方法需要把函數的參數以數組的形式列出來。
function test(name) { this.name = name; //定義匿名函數的時候一定要在最后加; this.inf = function(a,b) { document.writeln("我的name是"+a+b); }; }; var p = new test(); var name = "hello"; p.inf.call(window,"date","ketty"+"<br>"); p.inf.apply(window,["web","ok"+"<br>"]);//想要在apply()方法里面換行,必須把換行符寫到數組里面

3.jsp函數參數的傳遞和鴨子理論
jsp是一種弱類型的語言,函數參數的傳遞沒有嚴格的要求。調用函數的時候,實參的個數可以少於形參的個數,未傳入實際值的參數系統會為其賦值為undefined。
因此,在函數的定義中最好有對參數類型的檢測處理,防止程序出現異常的錯誤。這就是鴨子理論。判斷參數類型的時候,我們通常要用到typeof()和instance()這兩個函數。typeof用以獲取一個變量或者表達式的類型,typeof一般只能返回如下幾個結果:
number,boolean,string,function(函數),object(NULL,數組,對象),undefined。
很明顯,typeof()有很強的局限性。當要具體的判斷某個對象是否為某個類的實例變量的時候,就要用到instance()方法了。
//函數參數類型的判斷函數對參數進行邏輯操作之前必須先對參數類型進行判斷鴨子理論 function changeAge(person) { if(typeof person == 'object' && typeof person.age=='number') { document.write("函數執行前的age:"+person.age+"<br>"); person.age=10; document.write("函數執行中的age:"+person.age+"<br>"); } else { document.write("參數類型不符合"+typeof person+"<br>"); } } //采用不同的方式調用changeAge()函數 changeAge(); changeAge('xxx'); changeAge(true); p0={abc:34}; changeAge(p0); p={age:25}; changeAge(p);

4.函數的protype屬性
函數的使用規則/call/apply/函數的獨立性/函數參數的傳遞/函數的重載/鴨子理論/prototype方法動態增加方法和屬性
