js面向?qū)ο笾R妱?chuàng)建對象的幾種方式(工廠模式、構(gòu)造函數(shù)模式、原型模式)
在上篇文章給大家介紹了javascript面向?qū)ο蠡A(chǔ),本篇文章繼續(xù)深入學(xué)習(xí)javascript面向?qū)ο?,JS的語法非常靈活,簡單的對象創(chuàng)建就有好幾種不同的方法。這些過于靈活的地方有時候確實(shí)很讓人迷惑,那么今天我們就來梳理一下JS中常用的創(chuàng)建對象的幾種方法吧。
前言
雖然使用 Object構(gòu)造函數(shù) 或者使用 對象字面量 可以很方便的用來創(chuàng)建一個對象,但這種方式有一個明顯的缺點(diǎn):使用一個接口創(chuàng)建多個對象會產(chǎn)生很多冗余的代碼。因此為了解決這個問題,人們開始使用以下幾種方式來常見對象。
工廠模式
該模式抽象了創(chuàng)建對象的具體過程,用函數(shù)來以特定接口創(chuàng)建對象的細(xì)節(jié)
function cPerson(name,sex,age){ var o = new Object(); o.name = name; o.sex = sex; o.age = age; o.show = function(){ console.log(this.name,this.age,this.sex); } return o; } var p1 = cPerson('謙龍','男','100'); p1.show(); var p2 = cPerson('雛田','女','14'); p2.show();
工廠模式測試
工廠方式的問題:使用工廠模式能夠創(chuàng)建一個包含所有信息的對象,可以無數(shù)次的調(diào)用的這個函數(shù)。雖然其解決了創(chuàng)建多個相似對象的問題,但卻沒有解決對象識別的問題(即如何得知一個對象的類型)
構(gòu)造函數(shù)模式
function CPerson(name,sex,age) {//注意這里 構(gòu)造函數(shù)首字母大寫 this.name = name; this.sex = sex; this.age = age; this.show = function () { console.log(this.name, this.age, this.sex); } } var p1 = new CPerson('謙龍','男','100'); p1.show(); var p2 = new CPerson('雛田','女','14'); p2.show();
構(gòu)造函數(shù)模式測試
注意構(gòu)造函數(shù)與工廠模式有些不同的地方,如下
構(gòu)造函數(shù)首字母大寫
沒有顯式地創(chuàng)建對象
將屬性和方法賦值給了 this 對象
沒有return語句
而且以這種方式來調(diào)用構(gòu)造函數(shù)會大致經(jīng)歷一下 幾個步驟
創(chuàng)建一個新的對象
將構(gòu)造函數(shù)的作用域賦值給這個對象(因此this就指向了這個對象)
執(zhí)行構(gòu)造函數(shù)中的代碼(即給新對象添加屬性和方法的過程)
返回對象
注意:構(gòu)造函數(shù)其實(shí)和普通的函數(shù)沒有太大的差別,唯一的不同在于調(diào)用方式的不同。以下演示不同的幾種調(diào)用方式
// 調(diào)用方式1 new 方式 var p1 = new CPerson('謙龍','男','100'); p1.show();//謙龍 100 男 // 調(diào)用方式2 普通函數(shù)調(diào)用 CPerson('謙龍','男','100'); window.show()//謙龍 100 男 注意屬性和方法會被設(shè)置到window對象上 // 調(diào)用方式3 在另一個對象的作用域中調(diào)用 var obj = new Object(); CPerson.call(obj,'謙龍','男','100'); obj.show(); //謙龍 100 男 在obj的作用域
構(gòu)造函數(shù)的問題:使用構(gòu)造函數(shù)最主要的問題就是每個方法都要在每個實(shí)例上重新創(chuàng)建一次,p1與p2的都有show方法,但不是同一個Function的實(shí)例,因?yàn)閒unction在js中也是一個對象。因此他們共有的show方法并不相等。
原型模式
每個函數(shù)都有一個prototype屬性,這個屬性是一個指針,指向一個對象。而這個對象的用途是 包含可以由 特定類型 的所有 實(shí)例 共享的屬性和方法。即調(diào)用構(gòu)造函數(shù)所創(chuàng)建的那個對象的 原型對象
好處是可以讓所有對象的實(shí)例共享他的屬性的方法。即無需在構(gòu)造函數(shù)中定義實(shí)例的信息
function CPerson(){ } CPerson.prototype.name='謙龍'; CPerson.prototype.sex='男'; CPerson.prototype.age=100; CPerson.prototype.show=function(){ console.log(this.name, this.age, this.sex); } var p1 = new CPerson(); p1.show(); //謙龍 100 男 var p2 = new CPerson(); p2.show();//謙龍 100 男 console.log(p1.show == p2.show)//true
以上內(nèi)容是關(guān)于js面向?qū)ο笾R妱?chuàng)建對象的幾種方式(工廠模式、構(gòu)造函數(shù)模式、原型模式),希望大家喜歡。
相關(guān)文章
實(shí)例學(xué)習(xí)JavaScript讀取和寫入cookie
本篇內(nèi)容主要給大家通過實(shí)例講述了JavaScript讀取和寫入cookie的相關(guān)知識點(diǎn),有這方面需要的朋友參考下吧。2018-01-01javascript實(shí)現(xiàn)圖片輪換動作方法
這篇文章主要介紹了javascript實(shí)現(xiàn)圖片輪換動作方法,文章通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08詳解原生JavaScript實(shí)現(xiàn)jQuery中AJAX處理的方法
這篇文章主要介紹了原生JavaScript實(shí)現(xiàn)jQuery中AJAX處理的方法,作者根據(jù)jQuery中一些對AJAX請求的處理方式來用原生API實(shí)現(xiàn),需要的朋友可以參考下2016-05-05