JavaScript -- 面向對象

概述javascript

  JavaScript自己並不是面向對象(不支持「class」關鍵字),只能經過其自己的一些特性來模擬面向對象編程。java

  主要分爲兩大類:編程

    1,原始對象方式;json

    2,構造函數方式(推薦)。函數

 

原始對象方式this

  直接使用json:prototype

		var Dog = {
			name : '';
			color : ''
		};

		var dog1 = {};
		dog1.name = "dog1";
		dog1.color = "yellow";

		var dog2 = {};
		dog2.name = "dog2";
		dog2.color = "blue";

  這類方式有2個缺點:1,原型與實例對象之間關係不明顯(dog1與dog2很難看出是Dog的實例);2,語法很是囉嗦。對象

 

  爲了解決語法囉嗦的問題,可使用如下方式:blog

		function Dog(name, color) {
			return {
				name : name,
				color : color
			}
		}

		var dog1 = Dog("dog1", 'yellow');
		var dog2 = Dog("dog2", "blue");

  此類方式仍舊存在缺點1。繼承

 

構造函數方式

  原型對象方式存在以上的問題,JavaScript提供構造器方式。

  構造器:形式上還是一個function,但其內部含有this關鍵字,可使用new 關鍵字調用構造器生成實例。

 

  使用構造器修改以前的代碼:

		function Dog(name, color) {
			this.name = name;
			this.color = color;
		}
		Dog.prototype.eat = function (){
			alert("eat something");
		};
		Dog.prototype.type = "dog";

		var dog1 = new Dog("dog1", "yellow");
		var dog2 = new Dog("dog2", "blue");

 

  這裏要說明的是prototype關鍵字,以上代碼中

		Dog.prototype.eat = function (){
			alert("eat something");
		};
		Dog.prototype.type = "dog";

  

  可使用this關鍵字代替:

    this.type = "dog";

    this.eat = function(){alert(「eat something");};

  

    可是this關鍵字方式存在一個問題:每一個實例都會從新生成type及eat,但咱們看到,對於type及eat每一個實例的內容都是同樣的,因此這樣就形成了內存的浪費。

  有沒有方式能夠解決這個問題呢?有,那就是使用prototype關鍵字。

 

    prototype關鍵字:每一個構造器均可以使用prototype,它指向另外一個對象,此對象的屬性和方法會被該構造器的實例繼承。

 

  總結:
     1,原型對象方式可能存在」原型與實例對象之間關係不明顯「、」語法囉嗦「的問題;

   2,構造器方式是推薦的方式,使用this關鍵字聲明屬性和方法,new關鍵字生成實例化對象;

   3,若構造器方式中含有一致的方法或屬性,可使用prototype關鍵字節約內存。

相關文章
相關標籤/搜索