JS常見創(chuàng)建類的方法小結(jié)【工廠方式,構(gòu)造器方式,原型方式,聯(lián)合方式等】
本文實(shí)例講述了JS常見創(chuàng)建類的方法。分享給大家供大家參考,具體如下:
Javascript是一種基于對(duì)象的語言,你遇到的所有東西幾乎都是對(duì)象。但是,它又不是一種真正的面向?qū)ο缶幊蹋∣OP)語言,因?yàn)樗恼Z法中沒有Class。(不過,ES6引入了Class這個(gè)概念,作為對(duì)象的模板。通過class關(guān)鍵字,可以定義類。ES6入門:http://es6.ruanyifeng.com/)。
但是在項(xiàng)目開發(fā)中,經(jīng)常用到JS面向?qū)ο箝_發(fā),這就需要我們?nèi)ビ肑S創(chuàng)建類,從而去實(shí)例化一些對(duì)象。接下來我們介紹一下在JS中創(chuàng)建類的幾種方式:
1.工廠方式:
//通過工廠方式創(chuàng)建對(duì)象,先定義一個(gè)工廠方法 function createObj(){ var obj = new Object(); obj.name="xxx"; obj.say=function(){ alert("我是xxx"); } return obj; } //調(diào)用工廠方法創(chuàng)建對(duì)象: var obj1 = createObj(); //也可以用這種形式 function createObj(){ var obj = {}; //這樣生成對(duì)象 obj.name="xxx"; obj.say=function(){ alert("我是xxx"); } return obj; } var obj1 = createObj();
這種方式的問題是每一次通過工廠方法去創(chuàng)建一個(gè)對(duì)象,這個(gè)對(duì)象的屬性name和方法say都必須重新創(chuàng)建一次,浪費(fèi)內(nèi)存。
2.構(gòu)造器方式:
//創(chuàng)建一個(gè)構(gòu)造器,構(gòu)造函數(shù)首字母大寫 function Obj(){ this.name="xxx"; this.say=function(){ alert("我是xxx"); }; } //利用構(gòu)造器,通過new關(guān)鍵字生成對(duì)象 var obj1=new Obj();
這是最基本的方式,但是也存在和工廠方式一樣的毛病。
3.原型方式:
//用空函數(shù)創(chuàng)建一個(gè)類 function Obj(){ } //在類的原型鏈上添加屬性和方法 Obj.prototype.name="xxx"; Obj.prototype.say=function(){ alert("我是xxx"); } //生成對(duì)象 var obj1=new Obj();
這個(gè)方式的缺點(diǎn)是,當(dāng)有引用屬性時(shí),改變一個(gè)對(duì)象的這個(gè)屬性也會(huì)改變其他對(duì)象的這個(gè)屬性。因?yàn)橐粋€(gè)引用屬性,都是指向的同一個(gè)地方。
4.原型/構(gòu)造聯(lián)合方式
//用構(gòu)造函數(shù)定義對(duì)象的非函數(shù)屬性 function Obj(name){ this.name=name; this.arr=new Array('a','b'); } //用原型方式定義對(duì)象的方法 Obj.prototype.say=function(){ alert("我是xxx"); } //生成對(duì)象 var obj1 = new Obj('xxx');
這種是目前用的最多的創(chuàng)建類和對(duì)象的方式,將方法和屬性用不同的方式封裝。
5.動(dòng)態(tài)原型方式
//動(dòng)態(tài)原型方式和原型/構(gòu)造混合方式的原理相似,唯一的區(qū)別就是賦予對(duì)象方法的位置 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();//凱撒
動(dòng)態(tài)原型模式是將所有的信息都封裝到構(gòu)造函數(shù)中,構(gòu)造函數(shù)中,只用say不存在的情況下,才會(huì)將它添加到原型中。這段代碼只有在初次調(diào)用時(shí)才會(huì)執(zhí)行。
實(shí)例化obj對(duì)象有三步:
1. 創(chuàng)建obj對(duì)象:
obj=new Object();
2. 將obj的內(nèi)部__proto__指向構(gòu)造他的函數(shù)Obj的prototype,同時(shí),obj.constructor===Obj.prototype.constructor,從而使得obj.constructor.prototype指向Obj.prototype(obj.constructor.prototype===A.prototype)。obj.constructor.prototype與的內(nèi)部_proto_是兩碼事,實(shí)例化對(duì)象時(shí)用的是_proto_,obj是沒有prototype屬性的,但是有內(nèi)部的__proto__,通過__proto__來取得原型鏈上的原型屬性和原型方法。
3. 將obj作為this去調(diào)用構(gòu)造函數(shù)Obj,從而設(shè)置成員(即對(duì)象屬性和對(duì)象方法)并初始化。
當(dāng)這3步完成,這個(gè)obj對(duì)象就與構(gòu)造函數(shù)Obj再無聯(lián)系,這個(gè)時(shí)候即使構(gòu)造函數(shù)Obj再加任何成員,都不再影響已經(jīng)實(shí)例化的obj對(duì)象了。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
- Javascript使用function創(chuàng)建類的兩種方法(推薦)
- Javascript 創(chuàng)建類并動(dòng)態(tài)添加屬性及方法的簡單實(shí)現(xiàn)
- JS創(chuàng)建類和對(duì)象的兩種不同方式
- JavaScript中創(chuàng)建類/對(duì)象的幾種方法總結(jié)
- JavaScript創(chuàng)建類/對(duì)象的幾種方式概述及實(shí)例
- javascript最常用與實(shí)用的創(chuàng)建類的代碼
- 利用MS AJAX注冊(cè)Javascript命名空間并創(chuàng)建類
- 討論javascript(一)工廠方式 js面象對(duì)象的定義方法
- javascript工廠方式定義對(duì)象
- JavaScript中使用構(gòu)造器創(chuàng)建對(duì)象無需new的情況說明
- JavaScript設(shè)計(jì)模式之工廠模式和構(gòu)造器模式
- javascript 混合的構(gòu)造函數(shù)和原型方式,動(dòng)態(tài)原型方式
相關(guān)文章
JS編寫函數(shù)實(shí)現(xiàn)對(duì)身份證號(hào)碼最后一位的驗(yàn)證功能
二代身份證號(hào)碼為18位,怎么編寫函數(shù)實(shí)現(xiàn)對(duì)身份證號(hào)碼最后一位的驗(yàn)證功能呢?今天小編通過代碼給大家分享下實(shí)現(xiàn)方法2016-12-12JavaScript獲取字符串實(shí)際長度(包含中英文)
這篇文章介紹了JavaScript獲取字符串實(shí)際長度(包含中英文)的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06webpack4 optimization使用總結(jié)
這篇文章主要介紹了webpack4 optimization使用總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11JS時(shí)間控制實(shí)現(xiàn)動(dòng)態(tài)效果的實(shí)例講解
下面小編就為大家?guī)硪黄狫S時(shí)間控制實(shí)現(xiàn)動(dòng)態(tài)效果的實(shí)例講解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07js實(shí)現(xiàn)網(wǎng)頁的兩個(gè)input標(biāo)簽內(nèi)的數(shù)值加減(示例代碼)
下面小編就為大家?guī)硪黄猨s實(shí)現(xiàn)網(wǎng)頁的兩個(gè)input標(biāo)簽內(nèi)的數(shù)值加減(示例代碼)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08