js中常見的4種創(chuàng)建對象方式與優(yōu)缺點
前言
說起創(chuàng)建對象,最容易想到的便是通過對象字面量方式直接定義一個對象吧,但這種方式只能創(chuàng)建少量,單獨且相互間無聯系的對象。若要批量創(chuàng)建對象,該如何?
1、工廠模式
實現:
function fn(a,b){ let obj = new Object() obj.a=a obj.b=b return obj } const test = fn(1,2)
優(yōu)點:解決了創(chuàng)建多個類似對象的問題
缺點:沒解決對象標識問題(即新建對象是什么類型)
2、構造函數模式
實現:
function Fn(a,b){ this.a=a this.b=b this.c=function(){ console.log(this.a) } } const test1 = new Fn(1,2) const test2 = new Fn(1,2) console.log(test1.c === test2.c)// false
優(yōu)點:new隱式創(chuàng)建對象,寫法簡潔
缺點:構造函數定義的方法會在每個實例上都要創(chuàng)建一遍(除非該方法聲明提到全局)
3、原型模式
實現:
function Fn(a,b){ Fn.prototype.a=a Fn.prototype.b=b Fn.prototype.c=function(){ console.log(a) } } const test = new Fn(1,2)
優(yōu)點:構造函數中定義的屬性和方法都可以被對象實例共享
缺點:原型上的屬性值如果是引用值,該值會在創(chuàng)建后的實例之間被污染,如下
function Fn(){ Fn.prototype.a=[1,2] } const test1 = new Fn() const test2 = new Fn() test1.a.push(3) console.log(test1.b, test2.b)// [1,2,3] [1,2,3] const test3 = new Fn()// 原型上屬性會重新賦值 console.log(test1.b, test2.b,test3.b)// [1,2] [1,2] [1,2]
4、Object.create()
實現:
const obj = { a:1 , b:2 } const test = Object.create(obj) console.log(test.a)// 1
優(yōu)點:通過一個對象構造另一個對象
缺點:構造過程是淺克隆,共享的引用值依舊存在被污染問題
其他模式
除了以上幾種常見的模式外,批量創(chuàng)建對象的方式還有
- 動態(tài)原型模式:僅在第一次調用構造函數時,將方法賦給原型對象的相應屬性,其他示例的處理方式同構造函數模式
- 寄生構造函數模式:僅僅封裝創(chuàng)建對象的代碼,然后再返回新創(chuàng)建的對象,仍使用new操作符調用
- 穩(wěn)妥構造函數模式:沒有公共屬性,只有私有變量和方法,以及一些get/set方法,用以處理私有變量。
總結
到此這篇關于js中常見的4種創(chuàng)建對象方式與優(yōu)缺點的文章就介紹到這了,更多相關js常見創(chuàng)建對象方式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!