閱讀459 返回首頁    go 阿裏雲 go 技術社區[雲棲]


javascript麵向對象程序設計


       在學習js麵向對象編程之前,首先需要知道什麼是麵向對象。麵向對象語言都有類的概念,通過它可以創建具有相同屬性和方法的對象。但js並沒有類的概念,因此js中的對象和其他語言的對象有所不同。

       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

  上一篇:go OpenStreetMap架構
  下一篇:go Android開發大牛博客