国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

屬性描述符

stackfing / 3049人閱讀

摘要:決定該屬性是否可重新設(shè)置描述符。此時(shí),屬性的描述符被稱為訪問描述符。屏蔽屬性當(dāng)你給一個(gè)對(duì)象賦值一個(gè)新的屬性時(shí),如果該對(duì)象的原型鏈上已存在屬性,并且被標(biāo)記為只讀時(shí),嚴(yán)格模式下會(huì)拋出異常,非嚴(yán)格模式下,這條賦值語(yǔ)句會(huì)被忽略。

屬性描述符
在ES5開始,所有屬性都具備了屬性描述符。

我們可以通過Object.getOwnPropertyDescriptor來觀察到屬性的描述符,它是長(zhǎng)這樣子的。

Object.getOwnPropertyDescriptor({a: 1}, "a");

// {
//   value: 1,
//   writable: true,
//   enumerable: true,
//   configurable: true
// }

writable決定該屬性是否只讀。
enumerable決定該屬性是否可枚舉。
configurable決定該屬性是否可重新設(shè)置描述符。

屬性描述符的設(shè)置

當(dāng)屬性的configurable為true時(shí),我們可以通過Object.defineProperty來修改屬性描述符。

"use strict";

var foo = {a: 1};

for(var i in foo) {console.log(i)};
// "a"

Object.defineProperty(foo, "a", {
  writable: false,
  enumerable: false,
  configurable: false
});

foo.a = 2;// Uncaught TypeError: Cannot assign to read only property "a" of object "#"

for(var i in foo) {console.log(i)};
// "nothing happend"

Object.defineProperty(foo, "a", { // Uncaught TypeError: Cannot redefine property: a
  configurable: true
});

訪問描述符(getter和setter)

getter和setter有兩種方式定義

字面量定義

var foo = {
  get a(){
    return this._a;
  },
  set a(value){
    this._a = value;
  }
};

使用Object.defineProperty定義

var foo = {a: 1};

Object.defineProperty(
  foo,
  "a",
  {
    get(){
      return this._a;
    },
    set(value){
      this._a = value;
    }
  }
);

這個(gè)時(shí)候再看看屬性a的描述符。

Object.getOwnPropertyDescriptor(foo, "a")

// {
//   get: ? a(),
//   set: ? a(value),
//   enumerable: true,
//   configurable: true
// }

當(dāng)出現(xiàn)gettersetter時(shí),valuewritable就會(huì)失效。
此時(shí),屬性a的描述符被稱為訪問描述符。
訪問描述符屬性描述符互斥,如果此時(shí)再重新設(shè)置value或者writable描述符,settergetter也會(huì)被丟棄。

屏蔽屬性
當(dāng)你給一個(gè)對(duì)象賦值一個(gè)新的屬性foo時(shí),如果該對(duì)象的原型鏈上已存在屬性foo,并且foo被標(biāo)記為只讀(writable: false)時(shí),嚴(yán)格模式下會(huì)拋出異常,非嚴(yán)格模式下,這條賦值語(yǔ)句會(huì)被忽略。這種屬性稱為屏蔽屬性

舉個(gè)例子

"use strict";

var anotherObject = {};

Object.defineProperty(anotherObject, "foo", {// 將anotherObject的foo屬性設(shè)為只讀
  value: 1,
  writable: false
});

var myObject = Object.create(anotherObject);// 將myObject的原型設(shè)置為anotherObject

console.log(myObject);// {}
console.log(myObject.foo);// 1

myObject.foo = 2;// Uncaught TypeError: Cannot assign to read only property "a" of object "#"

還有一種情況

當(dāng)你給一個(gè)對(duì)象賦值一個(gè)新的屬性foo時(shí),如果該對(duì)象的原型鏈上已存在屬性foo,并且foo被設(shè)置了setter時(shí),將會(huì)調(diào)用這個(gè)setter,并且該賦值語(yǔ)句將會(huì)被忽略,此時(shí)也會(huì)發(fā)生屬性屏蔽。
var anotherObject = {};

Object.defineProperty(anotherObject, "foo", {// 給anotherObject的foo屬性設(shè)置setter
  set(value) {
    console.log(value);
    this._foo = value;
  },
  get() {
    return this._foo;
  }
});

var myObject = Object.create(anotherObject);// 將myObject的原型設(shè)置為anotherObject

myObject.foo = 2;// 此時(shí)會(huì)觸發(fā)anotherObject.foo的setter,控制臺(tái)輸出2

console.log(Object.hasOwnProperty(myObject, "foo"));// false
解決方案

使用Object.defineProperty來添加屬性。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/100257.html

相關(guān)文章

  • [譯] 屬性訪問、特性和描述 2

    摘要:不像其他屬性,描述符在類級(jí)別上創(chuàng)建。當(dāng)所有者類被定義時(shí),每個(gè)描述符對(duì)象都是被綁定到一個(gè)不同的類級(jí)別屬性的描述符類實(shí)例。這必須返回描述符的值。此外,描述符對(duì)有一個(gè)方便的響應(yīng)和請(qǐng)求格式。 注:原書作者 Steven F. Lott,原書名為 Mastering Object-oriented Python __getattribute__()方法 __getattribute__()方法是...

    CloudwiseAPM 評(píng)論0 收藏0
  • Python中的屬性描述

    摘要:下面我們用描述符來實(shí)現(xiàn)中的動(dòng)態(tài)屬性和特性中提及的訂單結(jié)算代碼第四版使用描述符實(shí)現(xiàn)訂單結(jié)算功能描述符基于協(xié)議實(shí)現(xiàn),無需創(chuàng)建子類。特性是覆蓋型描述符。非覆蓋型描述符沒有實(shí)現(xiàn)方法的描述符屬于非覆蓋型描述符。類中定義的方法是非覆蓋型描述符。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之元編程篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、了解描述符...

    geekzhou 評(píng)論0 收藏0
  • 講清楚之 javascript 對(duì)象屬性描述

    摘要:所以搞清楚是理解對(duì)象屬性描述符的唯一途徑。是一個(gè)對(duì)象,對(duì)象里的屬性描述符有兩種類型數(shù)據(jù)描述符和存取描述符。描述符必須是這兩種形式之一不能同時(shí)是兩者。描述符中未顯示設(shè)置的特性使用其默認(rèn)值。創(chuàng)建一個(gè)新屬性默認(rèn)描述符的鍵值都是或者。 對(duì)象屬性描述符 當(dāng)別人對(duì)你提及對(duì)象屬性描述符,可能會(huì)蒙逼。而如果提及對(duì)象屬性的 get/set 方法就秒懂了,標(biāo)準(zhǔn)描述和習(xí)慣表述在這里有些差別,但是指向的是同一...

    zhjx922 評(píng)論0 收藏0
  • python 描述解析

    摘要:之所以是這樣是因?yàn)楫?dāng)訪問一個(gè)實(shí)例描述符對(duì)象時(shí),會(huì)將轉(zhuǎn)換為。而類的字典中則有描述符對(duì)象。這主要就是因?yàn)槊枋龇麅?yōu)先。此外,非數(shù)據(jù)描述符的優(yōu)先級(jí)低于實(shí)例屬性。參考以上就是本人對(duì)描述符的一些理解,有什么不正確的地方還請(qǐng)不吝指出,謝謝 什么是描述符 python描述符是一個(gè)綁定行為的對(duì)象屬性,在描述符協(xié)議中,它可以通過方法重寫屬性的訪問。這些方法有 __get__(), __set__(), 和...

    rozbo 評(píng)論0 收藏0
  • javaScript中的Object類型

    摘要:默認(rèn)為當(dāng)該屬性的為時(shí),才能被賦值運(yùn)算符改變??梢允侨魏斡行У闹禂?shù)值,對(duì)象,函數(shù)等。而這些篡改可能會(huì)影響對(duì)象的內(nèi)置屬性或方法,從而導(dǎo)致對(duì)象的正常功能可能無法使用。 屬性描述符 JavaScript提供了一個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu),用于描述對(duì)象的值,控制其行為,例如該屬性是否可寫、是否可配置、是否可修改以及是否可枚舉等。這個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu)被稱為‘屬性描述符’。每個(gè)屬性都有自己對(duì)應(yīng)的屬性描述符,保存該屬...

    hyuan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<