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