js物件導向之常見創建物件的幾種方式(工廠模式、建構函式模式、原型模式)_javascript技巧
在上篇文章給大家介紹了javascript面向對象基礎,本篇文章繼續深入學習javascript面向對象,JS的語法非常靈活,簡單的對象創建就有好幾種不同的方法。這些過於靈活的地方有時候確實很讓人迷惑,那麼今天我們就來梳理一下JS中常用的創建對象的幾種方法吧。
前言
雖然使用 Object構造函數 或使用 對象字面量 可以很方便的用來創建一個對象,但這種方式有一個明顯的缺點:使用一個接口創建多個對象會產生很多冗餘的代碼。因此為了解決這個問題,人們開始使用以下幾種方式來常見物件。
工廠模式
此模式抽象化了創建物件的具體過程,用函數來以特定介面建立物件的細節
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();
工廠模式測試
工廠方式的問題:使用工廠模式能夠創建一個包含所有資訊的對象,可以無數次的調用的這個函數。雖然其解決了創建多個相似對象的問題,但卻沒有解決對象識別的問題(即如何得知一個對象的類型)
建構子模式
function CPerson(name,sex,age) {//注意这里 构造函数首字母大写 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();
建構子模式檢定
注意構造函數與工廠模式有些不同的地方,如下
建構函式首字母大寫
沒有明確地建立物件
將屬性和方法賦值給了 this 物件
沒有return語句
而且以此方式來呼叫建構函式會大致經歷一下 幾個步驟
建立一個新的物件
將建構函式的作用域賦值給這個物件(因此this就指向了這個物件)
執行建構函式中的程式碼(即為新物件新增屬性和方法的過程)
回傳物件
注意:建構函式其實和普通的函式沒有太大的差別,唯一的差別在於呼叫方式的不同。 以下示範不同的幾種呼叫方式
// 调用方式1 new 方式 var p1 = new CPerson('谦龙','男','100'); p1.show();//谦龙 100 男 // 调用方式2 普通函数调用 CPerson('谦龙','男','100'); window.show()//谦龙 100 男 注意属性和方法会被设置到window对象上 // 调用方式3 在另一个对象的作用域中调用 var obj = new Object(); CPerson.call(obj,'谦龙','男','100'); obj.show(); //谦龙 100 男 在obj的作用域
建構函式的問題:使用建構子最主要的問題就是每個方法都要在每個實例上重新建立一次,p1與p2的都有show方法,但不是同一個Function的實例,因為function在js中也是一個物件。因此他們共有的show方法並不相等。
原型模式
每個函數都有一個prototype屬性,這個屬性是一個指針,指向一個物件。而這個物件的用途是 包含可以由 特定類型 的所有 實例 共享的屬性和方法。即呼叫建構子所建立的那個物件的 原型物件
好處是可以讓所有物件的實例共享他的屬性的方法。即無需在建構函式中定義實例的資訊
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
以上內容是關於js物件導向之常見創建物件的幾種方式(工廠模式、建構函式模式、原型模式),希望大家喜歡。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。

本文討論了使用瀏覽器開發人員工具的有效JavaScript調試,專注於設置斷點,使用控制台和分析性能。

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

本文說明瞭如何使用源地圖通過將其映射回原始代碼來調試JAVASCRIPT。它討論了啟用源地圖,設置斷點以及使用Chrome DevTools和WebPack之類的工具。

深入探討console.log輸出差異的根源本文將分析一段代碼中console.log函數輸出結果的差異,並解釋其背後的原因。 �...

掌握了入門級TypeScript教程後,您應該能夠在支持TypeScript的IDE中編寫自己的代碼,並將其編譯成JavaScript。本教程將深入探討TypeScript中各種數據類型。 JavaScript擁有七種數據類型:Null、Undefined、Boolean、Number、String、Symbol(ES6引入)和Object。 TypeScript在此基礎上定義了更多類型,本教程將詳細介紹所有這些類型。 Null數據類型 與JavaScript一樣,TypeScript中的null
