最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS創(chuàng)建對象的六種方式

 更新時間:2025年04月09日 11:04:31   作者:sevenliao  
在js中,對象是鍵值對的集合,可以通過很多種方式創(chuàng)建; 本文給大家介紹了六種創(chuàng)建方式:對象字面量、構造函數(shù)、Object.create()、工廠函數(shù)、class、單例模式,需要的朋友可以參考下

1.對象字面量(Object Literal)

用法: 直接通過{}定義對象,是最簡單的方式;

原理: 直接分配內存創(chuàng)建一個普通對象,繼承object.prototype;

  • 直接內存分配: 當使用{}定義對象時,js引擎會直接在堆內存中分配一個普通對象。
  • 隱藏原型繼承: 該對象的[[Prototype]](即 proto) 會自動指向 Object.prototype, 繼承原始對象默認方法 (如:toString).
  • 屬性初始化: 字面量中的屬性和方法會直接掛載到對象自身,而非原型鏈。

例子:

const person {
    name: '小明',
    age: 25,
    greet() {
        console.log(`hi , i'm ${this.name}`)
    }
}
person.greet() //hi ,i'm 小明
const obj = {key:“value”};

//等價于:
const obj = new Object(); //隱式調用 Object 構造函數(shù)
obj.key = "value";

特點:

  • 適合創(chuàng)建單例對象或一次性對象;
  • 所有屬性方法均為實例自身成員,無法共享

2.構造函數(shù)(constructor function)

用法:通過 new 關鍵字調用構造函數(shù)創(chuàng)建對象

原理: new 操作

  • 1.創(chuàng)建空對象: 在內存中創(chuàng)建一個新對象 {}
  • 2.綁定原型:將新對象的[[Prototype]] 即原型鏈, 指向構造函數(shù)的prototype屬性
  • 3.執(zhí)行構造函數(shù):將構造函數(shù)內的this指向新對象,執(zhí)行構造函數(shù)代碼(初始化屬性)
  • 4.返回對象: 若構造函數(shù)未顯示返回其他對象,則返回新對象;

例子:

function person(name, age){
    // this = {};  (隱式操作)
    // this.__proto__ = person.prototype; (隱式操作)
    this.name = name;
    this.age = age;
    this.greet = function(){
        console.log(`hi, i'm ${this.name}`)
    }
    
    // return this;  (隱式操作)
}

const xiaoming = new person('小明', 25);
xiaoming.greet(); //hi, i'm 小明


//原型鏈結構: xiaoming.__proto__ -> person.prototype -> Object.prototype -> null;

缺點:每個實例的方法都是獨立的,浪費內存(可以優(yōu)化共享原型方法);

  • 若方法定義在構造函數(shù)內部,每個實例會有獨立的方法副本(浪費內存);
  • 若方法定義在person.prototype上,所有實例共享同一方法(推薦做法)

3. Object.create()

用法:基于現(xiàn)有對象作為原型創(chuàng)建新對象。

原理:創(chuàng)建一個新對象,并將其Prototype 指向傳入的對象;

  • 顯式原型繼承:直接創(chuàng)建一個新對象,并手動指定其[[Prototype]] 即:原型鏈 __ proto __
  • 參數(shù)處理: 1.若傳入null, 新對象的[[Prototype]]為null (無原型鏈); 2.若傳入對象proto, 新對象繼承proto的屬性和方法;

例子:

const prototypeObj = {
    greet(){
         console.log(`hi, i'm ${this.name}`)
    }
}
const person = Object.create(prototypeObj);
person.name = "小明";
person.age = 10;
person.greet(); //hi , i'm 小明

擴展:可創(chuàng)建無原型的對象(Object.create(null)),適合純粹的數(shù)據(jù)存儲;

4.工廠函數(shù)(Factory Function)

用法: 封裝對象創(chuàng)建邏輯的函數(shù),直接返回新對象;

原理:手動創(chuàng)建對象并返回,不依賴 new 或原型鏈;

  • 封裝對象創(chuàng)建: 通過普通函數(shù)返回新對象,不依賴new或者原型鏈。
  • 獨立實例: 每次調用工廠函數(shù)都會產生新的對象,所有屬性和方法均為實例自身成員。

例子:

function createPeason(name,age){
    const obj = {}; //顯示創(chuàng)建對象
    obj.name = name;
    obj.age = age;
    obj.greet = function(){}   //方法不共享
    return obj;
}
const xiaoming = createPeason('小明',10);
xiaoming.greet();  //hi, i'm 小明;

特點:避免 new 的使用,但方法無法共享(每個實例的方法獨立)。

對比構造函數(shù):

  • 優(yōu)勢: 更直觀,避免new 的依賴。
  • 劣勢: 方法無法共享,內存效率低。 (因為是閉包啊)

5.ES6 class 語法

用法:使用clase關鍵字定義類,通過new實例化;

原理:本質是構造函數(shù)的語法糖(構造函數(shù)另一種寫法),基于原型鏈實現(xiàn)繼承。

  • 方法掛載: 類中定義的方法會自動添加到prototype對象上,實現(xiàn)共享;
  • 繼承機制: extends 關鍵字通過修改原型鏈實現(xiàn)繼承(子類的prototype 指向父類實例)

例子:

class Person {
    construtor(name,age){
        this.name = name;
        this.age = age;
    }
    greet(){
        console.log(`hi, i'm ${this.name}`)
    }
}
const xiaoming = new Person('小明',10);
xiaoming.greet(); // hi, i'm 小明;

//原型鏈結構: xiaoming.__proto__ -> Person.prototype -> Object.prototyle -> null;

優(yōu)點: 語法更清晰,支持繼承(extends)和靜態(tài)方法(static)

6.單例模式(Singleton)

用法:確保一個類只有一個實例;

原理:通過閉包或模塊化限制實例化次數(shù)

  • 閉包封裝: 通過立即執(zhí)行函數(shù)(iife)和閉包保存唯一實例的引用。
  • 惰性初始化: 在首次調用時創(chuàng)建實例,后續(xù)調用直接返回已存在的實例;

例子:

const singleton - (function(){
    let instance;
    function createInstance() {
        return { id: Math.random() };
    }
    return {
        getInstance(){
            if(!instance) instance = createInstance();
            return instance;
        }
    }
})();

const obj1 = singleton.getInstance();
const obj2 = singleton.getInstance();
console.log(obj1 === obj2); //true

匯總 - 總結對比

方式特點適用場景
對象字面量簡單直接,適合一次性對象簡單數(shù)據(jù)存儲、配置項
構造函數(shù)可復用,但方法定義在原型上 節(jié)省內存需要多個相似實例
Object.create()靈活控制原型鏈,可創(chuàng)建無原型的對象原型繼承、純凈對象
工廠函數(shù)避免 new, 但方法無法共享簡單對象生活
class語法清晰,支持繼承面向對象開發(fā)
單例模式全局唯一實例全局狀態(tài)管理

選擇建議:

  • 簡單對象: 優(yōu)先用對象字面量或者工廠函數(shù)。
  • 復用和繼承: 使用class或構造函數(shù)。
  • 原型控制: 使用Object.create()。
  • 全局唯一: 單例模式。

以上就是JS創(chuàng)建對象的六種方式的詳細內容,更多關于JS創(chuàng)建對象的資料請關注腳本之家其它相關文章!

相關文章

  • 詳解Javascript中DOM的范圍

    詳解Javascript中DOM的范圍

    “DOM2級遍歷和范圍”模塊定義了“范圍”接口。通過范圍可以選擇文檔中的一個區(qū)域,而不必考慮節(jié)點的界限(選擇在后臺完成,對用戶是不可見的)。下面這篇文章主要介紹了Javascript中DOM范圍的相關資料,需要的朋友可以參考下。
    2017-02-02
  • TypeScript中的類型斷言[as語法|<>語法]的使用

    TypeScript中的類型斷言[as語法|<>語法]的使用

    本文主要介紹了TypeScript中的類型斷言[as語法|<>語法]的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • 使用Three.js?實現(xiàn)虎年春節(jié)3D創(chuàng)意頁面

    使用Three.js?實現(xiàn)虎年春節(jié)3D創(chuàng)意頁面

    虎年春節(jié)將至,本文使用?React?+?Three.js技術棧,實現(xiàn)趣味?3D創(chuàng)意頁面,主要包括:ShadowMaterial、?MeshPhongMaterial等基本材質的使用、使用?LoadingManager展示模型加載進度、OrbitControls`的緩動動畫、TWEEN簡單補間動畫效果等,感興趣的朋友一起看看吧
    2022-01-01
  • 微信小程序滑動選擇器的實現(xiàn)代碼

    微信小程序滑動選擇器的實現(xiàn)代碼

    這篇文章主要介紹了微信小程序滑動選擇器的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • JavaScript在瀏覽器中的執(zhí)行機制

    JavaScript在瀏覽器中的執(zhí)行機制

    既然說到了JavaScript,那么就會繞不過去執(zhí)行上下文,只有理解了執(zhí)行上下文才能更好的理解JavaScript本身,不過本部分不是專門講解?JavaScript的,主要從JavaScript的執(zhí)行順序開始介紹一下JavaScript是怎樣運行的
    2023-09-09
  • 如何從JavaScript數(shù)組中刪除空對象

    如何從JavaScript數(shù)組中刪除空對象

    JS中數(shù)組是我們較為常用的一種數(shù)據(jù)結構,下面這篇文章主要給大家介紹了關于如何從JavaScript數(shù)組中刪除空對象的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • js實現(xiàn)刷新頁面后回到記錄時滾動條的位置【兩種方案可選】

    js實現(xiàn)刷新頁面后回到記錄時滾動條的位置【兩種方案可選】

    本文主要介紹了頁面的div中有滾動條,js實現(xiàn)刷新頁面后回到記錄時滾動條的位置的兩種方案,需要的朋友可以看下
    2016-12-12
  • 詳解JavaScript實現(xiàn)動態(tài)的輪播圖效果

    詳解JavaScript實現(xiàn)動態(tài)的輪播圖效果

    這篇文章主要介紹了JavaScript實現(xiàn)動態(tài)的輪播圖效果,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • js獲取本機的外網(wǎng)/廣域網(wǎng)ip地址完整源碼

    js獲取本機的外網(wǎng)/廣域網(wǎng)ip地址完整源碼

    通過js獲取本機的外網(wǎng)和廣域網(wǎng)ip地址的方法有很多,本文為大家介紹個不錯的方法,希望對大家有所幫助
    2013-08-08
  • JavaScript監(jiān)聽文本框回車事件并過濾文本框空格的方法

    JavaScript監(jiān)聽文本框回車事件并過濾文本框空格的方法

    這篇文章主要介紹了JavaScript監(jiān)聽文本框回車事件并過濾文本框空格的方法,涉及javascript操作文本框獲取、清空及刪除空格的技巧,需要的朋友可以參考下
    2015-04-04

最新評論

琼海市| 全椒县| 祥云县| 伊金霍洛旗| 横峰县| 新宁县| 丹巴县| 宣恩县| 浠水县| 蕲春县| 当雄县| 广丰县| 黎城县| 赫章县| 平阴县| 斗六市| 綦江县| 泗阳县| 青海省| 莱阳市| 八宿县| 富平县| 阳曲县| 平邑县| 疏附县| 星座| 临清市| 古浪县| 绥芬河市| 同仁县| 浪卡子县| 惠东县| 泸水县| 澄江县| 车险| 弋阳县| 和林格尔县| 斗六市| 潜江市| 巴彦淖尔市| 德钦县|