JS 高級篇
阿新 • • 發佈:2018-11-03
var copy res value public 私有屬性 object tex 能夠
1. Function 對象
Java的方法僅僅是方法,但是JS的方法是一個對象,可以作為參數!
- Function 對象引入
- Function 是 js 的方法對象,可以用 Function 實例化出任何 js 方法對象;
- 用 Function 創建方法對象
- Function 對象屬性
- Function 對象方法
2. JavaScript 閉包
- Js 變量的作用域
- 方法體外定義 ( var a=22; ),全局變量,所有方法可以取到
- 方法體內定義 ( var a=22; ),局部變量,外部方法不可以取到
- 方法體內定義 ( a=22; ),全局變量,所有方法可以取到
- 從外部讀取方法內部的局部變量:通過閉包
<script type="text/javascript"> var
- 閉包的概念
- 閉包就是能夠讀取其他函數內部變量的函數。
- 由於在 Javascript 語言中,只有函數內部的子函數才能讀取局部變量,因此可以把閉包簡單理解成“定義在一個 函數內部的函數”。
- 在本質上,閉包就是將函數內部和函數外部連接起來的一座橋梁。
- 閉包的用途
- 讀取函數內部的變量,
- 讓這些變量的值始終保持在內存中。
- 閉包的使用註意點
- 由於閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在 IE 中可能導致內存泄露。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。
- 閉包會在父函數外部,改變父函數內部變量的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變量當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數內部變量的值。
3. JavaScript 面向對象實現
- 面向對象三大特征
- 封裝、繼承、多態
- JS本身沒有,但可以模擬實現
- JavaScript 自定義對象
- 創建對象方式:
- 方式1,對象初始化器方式;鍵值對的形式
var marry={ name:"marry", age:2, shout:function(){ alter(this.name+this.age); }, action:function(){ alter("會吃"); } }
- 方式2,構造函數方式;
function Dog(name,age){ this.name=name; this.age=age; this.shout=function(){ alter(this.name+this.age); }; this.action=function(){ alter("會吃"); }; } var jack=new Dog("jack",1);
- 方式1,對象初始化器方式;鍵值對的形式
- 對象屬性定義:
- 私有屬性;
- 對象屬性;
- 類屬性;
//定義 function C(){ this.objPro="對象屬性1"; C.proyotype.objPro2="對象屬性2" var privatePro="私有屬性"; } C.classPro="類屬性"; //使用
//對象屬性 必須要 new var c=new C(); alter(c.objPro); alter(c.objPro2); //私有屬性,要用閉包取出 //類屬性,直接調用 alter(C.classPro);
- 對象方法定義:
- 私有方法;
- 對象方法;
- 類方法;
//定義 function(){ var privateFunc=function(){ alert("私有方法"); }; this.objFunc=function(){ alert("對象方法"); }; C.prototype.objFunc2=function(){ alert("對象方法2"); }; } C.classFunc=function(){ alert("類方法"); }; //調用 // 對象方法 必須要 new var c=new C(); c.objFunc(); c.objFunc2(); // 私有方法,內部調用 //類方法 C.classFunc();
- 創建對象方式:
- JavaScript 實現封裝特性
- 對象裏面對屬性進行封裝,在之後調用
- JavaScript 實現繼承特性
- Apply() 實現屬性和方法的繼承,原型還是不變
function Animal(name,age){ this.name=name; this.age=age; this.shout=function(){ alert(this.name+this.age); }; this.action=function(){ alert("會吃"); }; } function Dog(name,age){ Animal.apply(this, [name,age]); //把Animal的屬性copy給Dog ,原型不變,還是條狗 } var jack=new Dog("jack",1);
alert(jack.name); alert(jack.age); jack.shout(); jack.action(); - Prototype 實現原型的繼承;
function Dog(name,age){ Animal.apply(this, [name,age]); //把Animal的屬性copy給Dog } Dog.prototype=new Animal(); //原型改變,是animal
- Apply() 實現屬性和方法的繼承,原型還是不變
- JavaScript 實現多態特性
function Animal(){ this.say=function(){ alert("我是動物"); }; } function Dog(){ this.say=function(){ alert("我是狗"); }; } Dog.prototype=new Animal(); function Cat(){ this.say=function(){ alert("我是貓"); }; } Cat.prototype=new Animal(); function say(animal){ if(animal instanceof Animal){ animal.say(); } } var dog=new Dog(); var cat=new Cat(); say(dog); //我是狗 say(cat); //我是貓
JS 高級篇