javascript麵向對象程序設計
js對象可以定義為:”無需屬性的集合,其屬性可以是基本值、對象和函數。每個對象都是基於一個引用類型創建的。
js創建對象有以下兩種方法:
1、創建一個Object實例:
var person = new Object();
2、使用對象字麵量:
var person ={};
3、工廠模式:
function createPerson(name,age,job){ var p = new Object(); p.name=name; p.age=age; p.job=job; return p; } var p1=createPerson("jack",22,“front-end Engineer"); var p2=.....;
4.構造函數模式:
function Person(name,age,job){ this.name=name; this.age=age; this.job=job; this.sayName=function(){alert(this.name);}; } var p1= new Person("jack",22,"front-end Engineer"); var p2=...;
這裏暫停一下,因為構造函數模式比較重要,這裏解釋一下:這裏實際上是經曆了以下4個步驟:
(1)創建一個對象;
(2)將構造函數作用域賦給這個對象(所以this將指向這個新創建的對象)
(3)執行裏麵的代碼,為新對象添加屬性;
(4)返回新對象;
上麵創建的p1和p2都有一個constructor的屬性,它指向Person。並且p1和p2即使Person的實例,同時也是Object的實例,因為所有對象都繼承自Object。
缺陷:每個方法都要在實例上重新創建一遍,js中的函數是對象,因此可以將函數轉移到構造函數的外部:
function Person(name,age,job){ this.name=name; this.age=age; this.job=job; this.sayName=sayName; } fucntion sayName(){ alert("this.name"); } var p1=.....; var p2=....;
5.原形模式:
我們創建的函數都有一個prototype屬性,它是一個指向一個對象的指針。
6.抽象函數:
Object.extend=function(destination,source){ for(property in source){ destination[property]=source[property]; } return destination; } //定義一個抽象基類base,無構造函數 function base(){}; base.prototype={ initialize:function(){ this.oninit();//調用了一個虛方法 } } function SubClassA(){ //構造函數 } SubClassA.prototype=Object.extend({ propInSubClassA:"propInSubClassA", oninit:function(){ alert(this.propInSubClassA); } },base.prototype); function SubClassB(){ //構造函數 } SubClassB.prototype=Object.extend({ propInSubClassB:"propInSubClassB", oninit:function(){ alert(this.propInSubClassB); } },base.prototype); var objA=new SubClassA(); objA.initialize();//輸出"propInSubClassA" var objB=new SubClassB(); objB.initialize();//輸出"propInSubClassB"
最後更新:2017-04-03 05:40:09