国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JavaScript之Object.defineProperty()

這篇具有很好參考價值的文章主要介紹了JavaScript之Object.defineProperty()。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1. 對象的定義與賦值

經(jīng)常使用的定義與賦值方法obj.prop =value或者obj['prop']=value

let Person = {};
Person.name = "Jack";
Person["gender"] = "female";
console.log(Person.name); // Jack
console.log(Person.gender); // female
console.log(Person); // {name: 'Jack', gender: 'female'}

2. Object.defineProperty()語法說明

Object.defineProperty()的作用就是直接在一個對象上定義一個新屬性,或者修改一個已經(jīng)存在的屬性

Object.defineProperty(obj, prop, desc)
  1. obj 需要定義屬性的當前對象
  2. prop 當前需要定義的屬性名
  3. desc 屬性描述符

一般通過為對象的屬性賦值的情況下,對象的屬性可以修改也可以刪除,但是通過Object.defineProperty()定義屬性,通過描述符的設(shè)置可以進行更精準的控制對象屬性。

3. 屬性的特性以及內(nèi)部屬性

javacript 有三種類型的屬性

  1. 命名數(shù)據(jù)屬性:擁有一個確定的值的屬性。這也是最常見的屬性
  2. 命名訪問器屬性:通過gettersetter進行讀取和賦值的屬性
  3. 內(nèi)部屬性:由JavaScript引擎內(nèi)部使用的屬性,不能通過JavaScript代碼直接訪問到,不過可以通過一些方法間接的讀取和設(shè)置。比如,每個對象都有一個內(nèi)部屬性[[Prototype]],你不能直接訪問這個屬性,但可以通過Object.getPrototypeOf()方法間接的讀取到它的值。雖然內(nèi)部屬性通常用一個雙呂括號包圍的名稱來表示,但實際上這并不是它們的名字,它們是一種抽象操作,是不可見的,根本沒有上面兩種屬性有的那種字符串類型的屬性

4. 屬性描述符

通過Object.defineProperty()為對象定義屬性,有兩種形式,且不能混合使用,分別為數(shù)據(jù)描述符,存取描述符,下面分別描述下兩者的區(qū)別:

1. 數(shù)據(jù)描述符 --特有的兩個屬性(value,writable)

注意:當使用了writable和value屬性,不允許使用getter或setter這兩個方法

  • writable: 描述對象是否可寫(是否只讀)
    • 當我們之間在一個對象上定義某個屬性時, writable默認為true
    • 當我們通過屬性描述符定義一個屬性時, writable默認為false
let Person = {}
Object.defineProperty(Person, 'name', {
   value: 'jack',
   writable: true // 是否可以改變
})
let Person = {};
Object.defineProperty(Person, "name", {
    value: "Jack",
    // writable默認值是false, 不能改變屬性的值
});
Person.name = "rose";
console.log(Person.name); // Jack
-------------------------------------------------------------------------------------------
let Person = {};
Object.defineProperty(Person, "name", {
    value: "Jack",
    writable: true, // 可以改變value值
});
Person.name = "rose";
console.log(Person.name); // rose

注意,如果描述符中的某些屬性被省略,會使用以下默認規(guī)則:

屬性名 默認值
value undefined
get undefined
set undefined
writable false
enumerable false
configurable false

2. 存取描述符 --是由一對 getter、setter 函數(shù)功能來描述的屬性

注意:當使用了getter或setter方法,不允許使用writable和value這兩個屬性

get:一個給屬性提供getter的方法,如果沒有getter則為undefined。該方法返回值被用作屬性值。默認為undefined。

set:一個給屬性提供setter的方法,如果沒有setter則為undefined。該方法將接受唯一參數(shù),并將該參數(shù)的新值分配給該屬性。默認值為undefined。

let Person = {}
let temp = null
Object.defineProperty(Person, 'name', {
  get: function () {
    return temp
  },
  set: function (val) {
    temp = val
  }
})
let Person = {};
let temp = null;
Object.defineProperty(Person, "name", {
    get: function () {
        return temp;
    },
    set: function (val) {
        temp = val;
    },
});

Person.name = "Jack";
console.log(Person.name, temp); // Jack Jack

temp = "rose";
console.log(Person.name, temp); // rose rose

3. 存取器描述

當使用存取器描述屬性的特性的時候,允許設(shè)置以下特性屬性:

var obj = {};
Object.defineProperty(obj, "newKey", {
    get: function () {} | undefined,
    set: function (value) {} | undefined,
    configurable: true | false,
    enumerable: true | false,
});

getter/setter:

當設(shè)置或獲取對象的某個屬性的值的時候,可以提供getter/setter方法。

  • getter 是一種獲得屬性值的方法
  • setter是一種設(shè)置屬性值的方法。

在特性中使用get/set屬性來定義對應(yīng)的方法。

var obj = {};
var initValue = "hello";
Object.defineProperty(obj, "key", {
    get: function () {
        //當獲取值的時候觸發(fā)的函數(shù)
        return initValue;
    },
    set: function (value) {
        //當設(shè)置值的時候觸發(fā)的函數(shù),設(shè)置的新值通過參數(shù)value拿到
        initValue = value;
    },
});
//獲取值
console.log(obj.key); //hello

//設(shè)置值
obj.key = "change value";

console.log(obj.key); //change value

注意:get或set不是必須成對出現(xiàn),任寫其一就可以。如果不設(shè)置方法,則get和set的默認值為undefined

4. 數(shù)據(jù)描述符和存取描述均具有以下描述符

  • configrable 描述屬性是否配置,以及可否可以通過delete刪除(是否可配置)
    • 當我們之間在一個對象上定義某個屬性時, configrable默認為true
    • 當我們通過屬性描述符定義一個屬性時, configrable默認為false
  • enumerable 描述屬性是否會出現(xiàn)在for in 或者 Object.keys()的遍歷中(是否枚舉)
    • 當我們之間在一個對象上定義某個屬性時, enumerable默認為true
    • 當我們通過屬性描述符定義一個屬性時, enumerable默認為false

1. configrable 代碼片段分析

configurable:false不能刪除屬性:

let Person = {};
Object.defineProperty(Person, "name", {
    value: "Jack",
    configurable: false,
});

console.log(delete Person.name); // Cannot delete property 'name' of #<Object>

configurable:false不能重新定義屬性:

let Person = {};
Object.defineProperty(Person, "name", {
    value: "Jack",
    configurable: false,
});

Object.defineProperty(Person, "name", {
    value: "rose", // Cannot redefine property: name
});

在configurable:false但writable為true`的情況下可以修改屬性值:

let Person = {};
Object.defineProperty(Person, "name", {
    value: "Jack",
    configurable: false,
    writable: true,
});

// 通過屬性定義的形式可以修改name的值
Object.defineProperty(Person, "name", {
    value: "rose",
});

console.log(Person.name); // rose

// 通過賦值的形式可以修改name的值
Person.name = 'zgc'
console.log(Person.name);

configurable:true但writable為false的情況下可以通過屬性定義的形式可以修改name的值:

let Person = {};
Object.defineProperty(Person, "name", {
    value: "Jack",
    configurable: true,
    writable: false,
});

// 通過屬性定義的形式可以修改name的值
Object.defineProperty(Person, "name", {
    value: "rose",
});

console.log(Person.name); // rose

// 通過賦值的形式不可以修改, 因為writable為flse
Person.name = "zgc";
console.log(Person.name);

2. enumerable 代碼片段分析

let Person = {};
Object.defineProperty(Person, "name", {
    value: "Jack",
    configurable: false,
    writable: false, // 默認值
});

Person.gender = "male";

Object.defineProperty(Person, "age", {
    value: 24,
    enumerable: true,
});

console.log(Object.keys(Person)); // ['gender', 'age']
for (let k in Person) {
    console.log(k); // gender, age
}

注意:以下二種區(qū)別文章來源地址http://www.zghlxwxcb.cn/news/detail-487556.html

let Person = {};
Person.gender = "male";
// 等價于
Object.defineProperty(Person, "gender", {
    value: "male",
    configurable: true,
    enumerable: true,
    writable: true,
});

Object.defineProperty(Person, "age", {
    value: 24,
});
// 等價于
Object.defineProperty(Person, "age", {
    value: 24,
    configurable: false,
    enumerable: false,
    writable: false,
});

到了這里,關(guān)于JavaScript之Object.defineProperty()的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • vue3的響應(yīng)式賦值中數(shù)組array,對象object,集合set的重新賦值怎么操作,問過Chatgpt的答案

    vue3的響應(yīng)式賦值中數(shù)組array,對象object,集合set的重新賦值怎么操作,問過Chatgpt的答案

    vue3和ts結(jié)合開發(fā)的時候,總是會遇到引用數(shù)據(jù)類型的重新賦值的情況,但是在vue3中,又不能使用直接賦值的情況,因為會改變proxy的結(jié)構(gòu),導(dǎo)致響應(yīng)式失敗,那么該如何重新賦值響應(yīng)式對象數(shù)據(jù)成為了一個技巧問題,今天它來了 如果是數(shù)組的話,踩坑點:**清空數(shù)組,然后再

    2024年02月15日
    瀏覽(23)
  • Vue中的Object.defineProperty詳解

    Vue中的Object.defineProperty是一個比較重要的方法,它是可以定義對象中屬性的一個方法,相比于在對象中直接定義的對象,它更具有靈活性。 直接定義對象中的屬性是這樣的: 而Object.defineProperty可以直接在上面的對象中添加屬性,如下面所示: 如果用上面的方法進行定義屬性

    2024年02月13日
    瀏覽(17)
  • 詳解vue中的Object.defineProperty

    詳解vue中的Object.defineProperty

    ? ?如果想要age遍歷的話 就設(shè)置屬性 打印出來 發(fā)現(xiàn)有可以枚舉的屬性age? 參考課程: 011_尚硅谷Vue技術(shù)_Object.defineProperty_嗶哩嗶哩_bilibili ? // 1.Vue中的數(shù)據(jù)代理: ? ? // ? ?通過Vm對象來代理data對象中屬性的操作(讀/寫) ? ? // 2.Vue中數(shù)據(jù)代理的好處: ? ? // ? 更加方便的

    2024年02月04日
    瀏覽(22)
  • 使用object.defineProperty來更新數(shù)據(jù)示例

    使用object.defineProperty來更新數(shù)據(jù)示例

    vue+element UI 第001個 查看專欄目錄: 按照VUE知識點 ------ 按照element UI知識點 echarts,openlayers,cesium,leaflet,mapbox,d3,canvas 免費交流社區(qū) 專欄目標 在vue和element UI聯(lián)合技術(shù)棧的操控下,本專欄提供行之有效的源代碼示例和信息點介紹,做到靈活運用。 (1)提供vue2的一些基本操

    2024年02月06日
    瀏覽(16)
  • 在JavaScript中,Object.assign()方法或展開語法(...)來合并對象,Object.freeze()方法來凍結(jié)對象,防止對象被修改

    一、Object.freeze()方法來凍結(jié)對象,防止對象被修改 Object.freeze() 是JavaScript中的一個方法,用于凍結(jié)一個對象。被凍結(jié)的對象不能再被修改。具體來說,它做了兩件事情: 防止添加新的屬性:嘗試添加新屬性將失敗,不會拋出錯誤,但新屬性不會被添加到對象中。 防止刪除屬

    2024年02月02日
    瀏覽(28)
  • JavaScript 數(shù)組Array存儲方式及對象Object

    JavaScript 數(shù)組Array存儲方式及對象Object

    一、數(shù)組的存儲 1、當聲明一個變量時,var a = 111; 在后臺計算機翻譯時,var聲明 a變量 所以此時會產(chǎn)生一個棧內(nèi)存,變量 a 的初始值為undefined,然后 = 111 ; undefined消失,111的值被賦值給了a。如果多個變量賦值的話,棧內(nèi)存的執(zhí)行順序是先進后出的順序。也叫做壓棧。棧內(nèi)存

    2024年02月08日
    瀏覽(24)
  • ts定義對象類型Record<string, any>;和object、Object的區(qū)別

    ts定義對象類型Record<string, any>;和object、Object的區(qū)別

    Record 是 TS 內(nèi)置的一個高級類型,是通過映射類型的語法來生成索引類型的 比如傳入 \\\'a\\\' | \\\'b\\\' 作為 key,1 作為 value,就可以生成這樣索引類型: 所以這里的 Recordstring, any 也就是 key 為 string 類型,value 為任意類型的索引類型,可以代替 object 來用,更加語義化一點: Record 與

    2024年02月16日
    瀏覽(27)
  • JavaScript中對象的定義、引用和復(fù)制

    JavaScript是一種廣泛使用的腳本語言,其設(shè)計理念是面向?qū)ο蟮姆妒?。在JavaScript中,對象就是一系列屬性的集合,每個屬性包含一個名稱和一個值。屬性的值可以是基本數(shù)據(jù)類型、對象類型或函數(shù)類型,這些類型的值相互之間有著不同的特點。本文將探討JavaScript中對象的定義

    2024年02月02日
    瀏覽(17)
  • 【淺嘗C++】繼承機制=>虛基表/菱形虛繼承/繼承的概念、定義/基類與派生類對象賦值轉(zhuǎn)換/派生類的默認成員函數(shù)等詳解

    【淺嘗C++】繼承機制=>虛基表/菱形虛繼承/繼承的概念、定義/基類與派生類對象賦值轉(zhuǎn)換/派生類的默認成員函數(shù)等詳解

    ??專欄介紹:淺嘗C++專欄是用于記錄C++語法基礎(chǔ)、STL及內(nèi)存剖析等。 ??每日格言:每日努力一點點,技術(shù)變化看得見。 我們生活中也有繼承的例子,例如:小明繼承了孫老師傅做拉面的手藝。繼承就是一種延續(xù)、復(fù)用的方式。C++為了提高代碼的可復(fù)用性,引入了繼承機制,

    2024年04月10日
    瀏覽(32)
  • 【JavaScript】JavaScript 運算符 ⑤ ( 賦值運算符 | 基礎(chǔ)賦值運算符 與 復(fù)合賦值運算符 )

    【JavaScript】JavaScript 運算符 ⑤ ( 賦值運算符 | 基礎(chǔ)賦值運算符 與 復(fù)合賦值運算符 )

    JavaScript 賦值運算符種類 : 基礎(chǔ)賦值運算符 : 等于 : = ; 復(fù)合賦值運算符 : 加等 : += 減等 : -= 乘等 : *= 除等 : /= 取模等 : %= 有符號左移等 : = 有符號右移等 : = 無符號左移等 : = 無符號右移等 : = 在 JavaScript 語言中 , \\\" 賦值運算符 \\\" 的 作用是 為 變量 分配值 ; 最基礎(chǔ)的 \\\" 賦值運算

    2024年03月25日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包