日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

JS面向对象——Object.defineProperty

發(fā)布時(shí)間:2024/7/5 javascript 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JS面向对象——Object.defineProperty 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、JavaScript的面向?qū)ο?/h2>

JavaScript其實(shí)支持多種編程范式的,包括函數(shù)式編程和面向?qū)ο缶幊?#xff1a;

  • JavaScript中的對(duì)象被設(shè)計(jì)成一組屬性的無(wú)序集合,像是一個(gè)哈希表,有key和value組成;
  • key是一個(gè)標(biāo)識(shí)符名稱,value可以是任意類型,也可以是其他對(duì)象或者函數(shù)類型;
  • 如果值是一個(gè)函數(shù),那么我們可以稱之為是對(duì)象的方法;

如何創(chuàng)建一個(gè)對(duì)象呢?
早期使用創(chuàng)建對(duì)象的方式最多的是使用Object類,并且使用new關(guān)鍵字來(lái)創(chuàng)建一個(gè)對(duì)象

  • 這是因?yàn)樵缙诤芏郕avaScript開(kāi)發(fā)者是從Java過(guò)來(lái)的,它們也更習(xí)慣于Java中通過(guò)new的方式創(chuàng)建一個(gè)對(duì)象;

后來(lái)很多開(kāi)發(fā)者為了方便起見(jiàn),都是直接通過(guò)字面量的形式來(lái)創(chuàng)建對(duì)象

  • 這種形式看起來(lái)更加的簡(jiǎn)潔,并且對(duì)象和屬性之間的內(nèi)聚性也更強(qiáng),所以這種方式后來(lái)就流行了起來(lái);

二、對(duì)屬性操作的控制

在前面我們的屬性都是直接定義在對(duì)象內(nèi)部,或者直接添加到對(duì)象內(nèi)部的:

  • 但是這樣來(lái)做的時(shí)候我們就不能對(duì)這個(gè)屬性進(jìn)行一些限制:比如這個(gè)屬性是否是可以通過(guò)delete刪除呢?這個(gè)屬性是否在for-in遍歷的時(shí)候被遍歷出來(lái)呢?

如果我們想要對(duì)一個(gè)屬性進(jìn)行比較精準(zhǔn)的操作控制,那么我們就可以使用屬性描述符。

  • 通過(guò)屬性描述符可以精準(zhǔn)的添加或修改對(duì)象的屬性;
  • 屬性描述符需要使用 Object.defineProperty 來(lái)對(duì)屬性進(jìn)行添加或者修改;

三、Object.defineProperty

Object.defineProperty() 方法會(huì)直接在一個(gè)對(duì)象上定義一個(gè)新屬性,或者修改一個(gè)對(duì)象的現(xiàn)有屬性,并返回此對(duì)象

可接收三個(gè)參數(shù):

  • obj要定義屬性的對(duì)象;
  • prop要定義或修改的屬性的名稱或 Symbol;
  • descriptor要定義或修改的屬性描述符;

返回值:

  • 被傳遞給函數(shù)的對(duì)象。

四、屬性描述符分類

屬性描述符的類型有兩種:

  • 數(shù)據(jù)屬性(Data Properties)描述符(Descriptor);
  • 存取屬性(Accessor訪問(wèn)器 Properties)描述符(Descriptor);

五、數(shù)據(jù)屬性描述符






六、存取屬性描述符


var obj = {name: 'zep',age: 18,_address: '北京市' }// 數(shù)據(jù)屬性描述符 Object.defineProperty(obj, 'address', {enumerable: true,configurable: true,value: '深圳市',writable: true })// 存取屬性描述符 Object.defineProperty(obj, 'address', {enumerable: true,configurable: true,get: function () {return this._address},set: function (value) {this._address = value} }) console.log(obj) obj.address = '深圳市' console.log(obj)

七、同時(shí)定義多個(gè)屬性

Object.defineProperties() 方法直接在一個(gè)對(duì)象上定義 多個(gè) 新的屬性或修改現(xiàn)有屬性,并且返回該對(duì)象。

八、對(duì)象方法補(bǔ)充

獲取對(duì)象的屬性描述符:

  • getOwnPropertyDescriptor
  • getOwnPropertyDescriptors

禁止對(duì)象擴(kuò)展新屬性:preventExtensions

  • 給一個(gè)對(duì)象添加新的屬性會(huì)失敗(在嚴(yán)格模式下會(huì)報(bào)錯(cuò));

密封對(duì)象,不允許配置和刪除屬性:seal

  • 實(shí)際是調(diào)用preventExtensions
  • 并且將現(xiàn)有屬性的configurable:false

凍結(jié)對(duì)象,不允許修改現(xiàn)有屬性: freeze

  • 實(shí)際上是調(diào)用seal
  • 并且將現(xiàn)有屬性的writable: false
var obj = {name: 'zep',age: 18 } // 禁止對(duì)象繼續(xù)添加新的屬性 /*Object.preventExtensions(obj)obj.height = 1.88 obj.address = '深圳市' console.log(obj)*/ // 禁止對(duì)象配置/刪除里面的屬性 /*for (var key in obj) {Object.defineProperty(obj, key, {configurable: false,enumerable: true,writable: true,value: obj[key]}) }*/ /*Object.seal(obj) delete obj.name delete obj.age console.log(obj)*/ // 讓屬性不可以修改(writable: false) Object.freeze(obj) obj.name = 'haha' console.log(obj.name)

總結(jié)

以上是生活随笔為你收集整理的JS面向对象——Object.defineProperty的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。