面向對象javascript
DOM事件java
異步交互ajaxajax
在JS中能夠把任意的引用和變量都當作是一個對象。面向對象的主要三個表現形式:數組
封裝app
繼承異步
多態函數
var obj={ name: "sam", age: 12, method: function(){ var objName=this.name; return objName; }, ale: function(){ var that=this; function sum(num1,num2){ this.num=that.age; return num1+this.num+num2; } console.log(sum(1,2)); } }
單例模式有不污染全局變量和節約window棧內存的優勢this
var main={ init:function(){ this.changeName(); }, changeName:function(){ var that=this; var oBody=document.body; oBody.onclick=function(){ that.changeValue(); } }, changeValue:function(){ document.getElementById("one").value="sam"; } } main.init();
可以快速地根據不一樣需求,傳入不一樣參數,來返回不一樣的對象,缺點是不能判斷對象的類型prototype
function self(name,age,sex){ var person={}; person.name=name; person.age=age; person.sex=sex; if(sex=="man"){ person.job="coder"; } if(sex=="woman"){ person.job="beatiful"; } return person; } var mine=self("sam",22,"man"); console.log(mine.job);
構造函數模式可以解決工廠模式不能判斷對象類型的缺點,構造函數模式可以自定義類,構造具備相同屬性和方法的實例code
function Person(){ this.eat="food"; this.sleep="night"; this.say=function(){ console.log("I am person,I can speak"); } } var person1=new Person(); person1.say();
call()和apply()方法
call()方法:
讓調用對象執行,而後第一參數是誰,調用對象的this就改變指向是誰,後邊跟參數,依次對應傳入
apply()方法:
讓調用對象執行,而後第一參數是誰,調用對象的this就改變指向是誰,後邊跟參數,以數組的形式傳入
把被繼承者的構造函數賦值給繼承者的prototype,注意須要給繼承者的prototype手動添加constructor屬性
function A(){ this.name="A"; this.sayHi=function(){ console.log("Hi!I am A"); } } function B(){ this.name="B"; this.age=22; this.sayHi=function(){ console.log("Hi,I am B"); } } B.prototype.work=function(){ console.log("I can play"); } A.prototype=new B(); A.prototype.constructor=A; var a=new A(); console.log(a);
把被繼承者設置的私有屬性,克隆一份做爲繼承者私有的
function A(){ this.name="A"; this.age=22; this.sayName=function(){ console.log("I am A"); } } function B(){ A.call(this); } var b=new B(); console.log(b);
繼承者繼承了被繼承者私有和公有的屬性和方法
function A(){ this.x=100; } A.prototype.getX=function(){ console.log(this.x); } function B(){ var temp=new A(); for(var key in temp){ this[key]=temp[key]; } } var b=new B(); console.log(b);
javascript中沒有嚴格的多態,由於JS中沒有重載,相同名字的函數不能同時存在,後定義的重名函數會覆蓋先定義的函數(即便兩個形參不相同)。咱們能夠寫一個通用方法來模擬面嚮對象語言的多態
function simPoly(){ if(arguments.length==1){ return function(){ console.log(1); } } if(arguments.length==2){ return function(){ console.log(2); } } } simPoly(1,2)();