JavaScript對象訪問器的工作原理及使用方法
一、前言
今天來聊一下JavaScript
中的對象訪問器。JavaScript
的主要功能之一是能夠定義對象,這些對象可以封裝屬性和方法,在與對象屬性 交互的各種方式中,訪問器起著至關(guān)重要的作用。本文將深入探討 JavaScript
對象訪問器是什么、它是如何工作的以及使用對象訪問器的作用。
二、什么是 JavaScript 對象訪問器
JavaScript
對象訪問器是一種用于定義和操作對象屬性的方法。它們由兩個特殊函數(shù)組成:getter
和setter
。getter:函數(shù)用于獲取對象的屬性值。當(dāng)訪問該屬性時,
getter
函數(shù)會被調(diào)用,并返回相應(yīng)的屬性值。setter:函數(shù)用于設(shè)置對象的屬性值。當(dāng)對屬性進(jìn)行賦值操作時,
setter
函數(shù)會被調(diào)用,并接受一個參數(shù),即要設(shè)置的屬性值。
例子:使用getter
和setter
比較典型的案例是vue.js
中的依賴收集和觸發(fā)依賴回調(diào)方法。
當(dāng)讀取對象屬性時進(jìn)行依賴收集;當(dāng)對象屬性值改變時,觸發(fā)依賴回調(diào)方法。
1.定義對象訪問器屬性的兩種方式
使用對象字面量的方式定義。
使用
Object.defineProperty
方法定義。
1.1 使用對象字面量定義
下面是如何使用對象字面量方式定義 getter
和 setter
的示例:
let order = { firstName: "Vilan", lastName: "Liu", get fullName() { return `${this.firstName} ${this.lastName}`; }, set fullName(value) { let nameList = value.split(' '); this.firstName = nameList[0]; this.lastName = nameList[1]; } }; console.log(person.fullName); // Vilan Liu person.fullName = "Jack Ma"; console.log(person.firstName); // Jack console.log(person.lastName); // Ma
在當(dāng)前示例中,fullName
是一個訪問器屬性。你對firstName
和lastName
屬性的修改將會間接影響到該屬性的變化。
1.2使用Object.defineProperty方法定義
下面是如何使用Object.defineProperty
方法定義訪問器屬性 的示例:
let person = { firstName: "Vilan", lastName: "Liu" }; Object.defineProperty(person, 'fullName', { get: function() { return `${this.firstName} ${this.lastName}`; }, set: function(name) { let nameList = name.split(' '); this.firstName = nameList[0]; this.lastName = nameList[1]; } }); console.log(person.fullName); // Vilan Liu person.fullName = "Jack Ma"; console.log(person.firstName); // Jack console.log(person.lastName); // Ma
在當(dāng)前示例中,通過Object.defineProperty
定義了person
對象的訪問器屬性fullName
。
三、使用對象訪問器的作用
1.屬性封裝和驗證
對象訪問器允許你隱藏對象的內(nèi)部的私有屬性,同時提供一個屬性訪問器讓你能夠正常去寫私有屬性,避免私有屬性直接被修改而導(dǎo)致超出預(yù)期的錯誤。這在面向?qū)ο缶幊讨幸彩墙?jīng)常使用的封裝方式。
let user = { _wallet: 0, get wallet() { return this._wallet; }, set wallet(value) { if (value <= 0) { console.error("錢包余額必須大于0!"); } else { this._wallet = value; } } }; user.wallet = -1; // 錢包余額必須大于0! user.wallet = 1000000; console.log(user.user); // 1000000
2.屬性計算
getter
可用于創(chuàng)建基于其他屬性計算的屬性。當(dāng)一個屬性依賴于其他屬性的值時,這很有用。
let iceCream = { price: 5, amount: 2, get subtotal() { return this.price * this.amount; } }; console.log(iceCream.subtotal); // 10
3.屬性只讀
可以使用 getter
創(chuàng)建只讀屬性,而無需定義 setter
。
let rectangle = { width: 20, height: 10, get area() { return this.width * this.height; } }; console.log(rectangle.area); // 200 rectangle.area = 100; console.log(car.description); // 200
在該例子中area
屬性只設(shè)置了一個getter
訪問器,所以為只讀訪問器屬性。
四、總結(jié)
JavaScript
對象訪問器是一項強(qiáng)大的功能,可增強(qiáng)你對對象屬性的交互方式。通過使用 getter
和 setter
,可以向?qū)ο髮傩蕴砑?strong>封裝、驗證操作,還能定義計算和只讀屬性。了解和利用對象訪問器可以生成更健壯、更干凈和可維護(hù)性強(qiáng)的代碼。
以上就是JavaScript對象訪問器的工作原理及使用方法的詳細(xì)內(nèi)容,更多關(guān)于JavaScript對象訪問器的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Canvas?drawImage方法實現(xiàn)圖片壓縮詳解
這篇文章主要為大家介紹了Canvas?drawImage方法實現(xiàn)圖片壓縮詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11動態(tài)更新highcharts數(shù)據(jù)的實現(xiàn)方法
下面小編就為大家?guī)硪黄獎討B(tài)更新highcharts數(shù)據(jù)的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-05-05怎樣用Javascript實現(xiàn)函數(shù)柯里化與反柯里化
這篇文章主要介紹了怎樣用Javascript實現(xiàn)函數(shù)柯里化與反柯里化,想了解函數(shù)柯里化的同學(xué),可以參考下2021-04-04基于webpack-hot-middleware熱加載相關(guān)錯誤的解決方法
下面小編就為大家分享一篇基于webpack-hot-middleware熱加載相關(guān)錯誤的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02javascript DOM操作之動態(tài)刪除TABLE多行
DOM動態(tài)刪除TABLE tr行的實現(xiàn)代碼,需要的朋友可以參考下。2009-12-12一文詳解Promise.race()方法功能及應(yīng)用場景
這篇文章主要為大家介紹了Promise.race()方法功能及應(yīng)用場景詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03