JS常見建立類的方法小結【工廠方式,構造器方式,原型方式,聯合方式等】,js小結

來源:互聯網
上載者:User

JS常見建立類的方法小結【工廠方式,構造器方式,原型方式,聯合方式等】,js小結

本文執行個體講述了JS常見建立類的方法。分享給大家供大家參考,具體如下:

Javascript是一種基於對象的語言,你遇到的所有東西幾乎都是對象。但是,它又不是一種真正的物件導向編程(OOP)語言,因為它的文法中沒有Class。(不過,ES6引入了Class這個概念,作為對象的模板。通過class關鍵字,可以定義類。ES6入門:http://es6.ruanyifeng.com/)。

但是在項目開發中,經常用到JS物件導向開發,這就需要我們去用JS建立類,從而去執行個體化一些對象。接下來我們介紹一下在JS中建立類的幾種方式:

1.工廠方式:

//通過工廠方式建立對象,先定義一個Factory 方法function createObj(){  var obj = new Object();  obj.name="xxx";  obj.say=function(){    alert("我是xxx");  }  return obj;}//調用Factory 方法建立對象:var obj1 = createObj();//也可以用這種形式function createObj(){  var obj = {}; //這樣產生對象  obj.name="xxx";  obj.say=function(){    alert("我是xxx");  }  return obj;}var obj1 = createObj();

這種方式的問題是每一次通過Factory 方法去建立一個對象,這個對象的屬性name和方法say都必須重新建立一次,浪費記憶體。

2.構造器方式:

//建立一個構造器,建構函式首字母大寫function Obj(){  this.name="xxx";  this.say=function(){    alert("我是xxx");  };}//利用構造器,通過new關鍵字產生對象var obj1=new Obj();

這是最基本的方式,但是也存在和工廠方式一樣的毛病。

3.原型方式:

//用空函數建立一個類function Obj(){}//在類的原型鏈上添加屬性和方法Obj.prototype.name="xxx";Obj.prototype.say=function(){  alert("我是xxx");}//產生對象var obj1=new Obj();

這個方式的缺點是,當有引用屬性時,改變一個對象的這個屬性也會改變其他對象的這個屬性。因為一個引用屬性,都是指向的同一個地方。

4.原型/構造聯合方式

//用建構函式定義對象的非函數屬性function Obj(name){  this.name=name;  this.arr=new Array('a','b');}//用原型方式定義對象的方法Obj.prototype.say=function(){  alert("我是xxx");}//產生對象var obj1 = new Obj('xxx');

這種是目前用的最多的建立類和對象的方式,將方法和屬性用不同的方式封裝。

5.動態原型方式

//動態原型方式和原型/構造混合方式的原理相似,唯一的區別就是賦予對象方法的位置function Person(name, sex) {  this.name = name;  this.sex = sex;  if (typeof this.say != "function") {    Person.prototype.say = function () {      alert(this.name);    }  }}var man =new Person ("凱撒", "男");man.say();//凱撒

動態原型模式是將所有的資訊都封裝到建構函式中,建構函式中,只用say不存在的情況下,才會將它添加到原型中。這段代碼只有在初次調用時才會執行。

執行個體化obj對象有三步:

1. 建立obj對象:

obj=new Object();

2. 將obj的內部__proto__指向構造他的函數Obj的prototype,同時,obj.constructor===Obj.prototype.constructor,從而使得obj.constructor.prototype指向Obj.prototype(obj.constructor.prototype===A.prototype)。obj.constructor.prototype與的內部_proto_是兩碼事,執行個體化對象時用的是_proto_,obj是沒有prototype屬性的,但是有內部的__proto__,通過__proto__來取得原型鏈上的原型屬性和原型方法。

3. 將obj作為this去調用建構函式Obj,從而設定成員(即對象屬性和對象方法)並初始化。

當這3步完成,這個obj對象就與建構函式Obj再無聯絡,這個時候即使建構函式Obj再加任何成員,都不再影響已經執行個體化的obj對象了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.