js中對象的建立以及繼承的實現

學習js一段時間以來,在網上沒有找到比較系統的關於js面向對象方面的文章,故有感而發寫此博文,供你們分享。注:本文章很大部分參考的張龍老師的資料,在此先感謝他,我只是作個總結而已。java

一對象的建立設計模式

1.基於已有對象的擴充數組

var object = new Object();
	object.name = "jason";
	object.fn = function()
	{
		alert(this.name);
	}

這種方式最不推薦了,除非臨時須要用到對象,由於它根本失去了面向對象的特性。

2工廠方式app

function createObject(name,age)//工廠方法,用於建立對象
	{
		var obj = new Object();
		
		obj.name = name;
		obj.age =age;
		obj.fn = function()
		{
			alert("name="+this.name+"; age="+this.age);
		}
		
		return obj;
	}
	
	var obj1 = createObject("jason",21);
	var obj2 = createObject("jack",20);
	
	obj1.fn();
	obj2.fn();

這種方式應用工廠方法的設計模式建立對象,可是有兩大不足之處:(1)每一個工廠方法所建立的對象都會擁有一份本身的fn方法,而這個方法的代碼是重複的,於是比較佔用內存引發資源浪費;(2)建立對象的方式其實就調用方法而已,未用new關鍵字來建立,熟悉java、C++面向對象的朋友們都會感受彆扭。所以也不推薦使用.

3.原形方式函數

function Person()
	{
		
	}
	Person.prototype.name = new Array("jason");
	Person.prototype.age = 21;
	Person.prototype.fn= function()
	{
		alert("name= "+this.name+" ;age="+this.age);
	}
	
	var p1 = new Person();
	var p2 = new Person();
	
	p2.name.push("jack"); //用原形方式其實全部對象共享的屬性的,全部對 //象的name屬性指向同一份數組對象了,所以對p2name屬性的修改會影響的p1 的name屬性的
	
	p1.fn();
	p2.fn();

運行結果以下: ,兩個結果都是同樣的,說明這兩個對象是也共享了name屬性的,這是咱們不須要的,咱們只需不一樣對象共享方法而已,而且帶來了很大的麻煩。而且這種方式和第一種方式比較相似,一樣採起擴展方式,沒有了面向對象中「類」的那種模版做用了,堅定不推薦。

4.構造函數+原形的方式學習

function Person(name,age)
	{
		this.name = name;
		this.age = age;
		
		if(typeof Person.isFirst == "undefined")
		{
			Person.prototype.fn = function()//爲Person的原形添加fn屬性(函數能夠做爲對象的屬性的)
			{
				     alert("name="+this.name+";age="+this.age);
			}
		}
		
		Person.isFirst = true;//建立了一個對象後將其設爲true,就   //不會執行上面的if語句,從而保證全部對象共享一份fn方法代碼
	}
	
	var p1 = new Person("jason",21);
	var p2 = new Person("jack",20);
	
	p1.fn();
	p2.fn();

這種方式經過一個標準變量isFirst 來判斷是否是用該「類」建立的第一個對象,從而保證了全部對象共享一份方法代碼,用new關鍵字來建立對象使人如見故友

二繼承this

1.對象冒充、2.call()和apply()方式、3.原形鏈方式spa

function Parent(name)
	{
		this.name = name;
		this.sayName =function()
			{
				alert("hi my name is "+name);
			};
		
	}
	
	function Child(name,age)
	{
		this.parent = Parent;//這三條語句是用的對象冒充實現繼承的
		this.parent(name);//
		delete this.parent;//
               // Father.call(this,name);//用call方法實現繼承,能夠替代上面的三句
                // Father.cpply(this,[name]);//用apply方法實現繼承,能夠替代最上面的上面的三句                 // Child.prototype = new Fahter();//用原形鏈方法實現繼承,能夠替代最上面的上面的三句,不過這裏的name要另外賦值了
this.age = age;
		
		this.sayAge=function()
			{
				
				alert("hi my name is "+name+" and my  age is "+age);
			};
		
	}
	
	var p = new Parent("father");
        var c = new Child("son",18);
		
		p.sayName();//father
		c.sayName();//son
                c.sayAage();//18
相關文章
相關標籤/搜索