成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

《javascript高級(jí)程序設(shè)計(jì)》筆記:對(duì)象數(shù)據(jù)屬性和訪問器屬性

mating / 2846人閱讀

摘要:枚舉對(duì)象的屬性第二種情況設(shè)置為,可以被枚舉。內(nèi)置對(duì)象訪問器屬性方法介紹摘自方法返回指定對(duì)象上一個(gè)自有屬性對(duì)應(yīng)的屬性描述符。對(duì)象中存在的屬性描述符主要有數(shù)據(jù)描述符和訪問器描述符兩種返回傳遞給函數(shù)的對(duì)象參考中的

1. 什么是對(duì)象
對(duì)象是無序?qū)傩缘募?/pre>

創(chuàng)建自定義對(duì)象最簡(jiǎn)單的方式就是以字面量的形式創(chuàng)建對(duì)象(或創(chuàng)建一個(gè)Object實(shí)例),然后再為它添加屬性和方法,如下所示:

var person = {
  name: "Nicholas",
  age: 29,
  sayHi: function() {
    console.log(this.name);
  }
}

但是我們需要定義對(duì)象中的某個(gè)屬性能否修改,能夠重寫等屬性,那我們應(yīng)該如何定義

2. 內(nèi)置屬性—數(shù)據(jù)屬性

Object.defineProperty()方法介紹(摘自MDN)

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

語法:Object.defineProperty(obj, prop, descriptor)
參數(shù):
(1)obj:需要被操作的目標(biāo)對(duì)象
(2)prop:目標(biāo)對(duì)象需要定義或修改的屬性的名稱
(3)descriptor:將被定義或修改的屬性的描述符
返回:被傳遞給函數(shù)的對(duì)象

2.1 configurable屬性

是否可以刪除目標(biāo)屬性或是否可以再次修改屬性的特性(writable, configurable, enumerable)。默認(rèn)為false

設(shè)置為true可以被刪除或可以重新設(shè)置特性;
設(shè)置為false,不能被可以被刪除或不可以重新設(shè)置特性,只能將writabletrue置為false

一旦把屬性定義為不可配置的,就不能再把它便會(huì)可配置的,這一點(diǎn)很重要

主要起到數(shù)據(jù)的保護(hù)作用,決定了目標(biāo)屬性是否可以使用delete刪除,是否可以再次設(shè)置特性

//-----------------測(cè)試目標(biāo)屬性是否能被刪除------------------------
  var obj = {}
  
  // 第一種情況:configurable設(shè)置為true,可以被刪除。
  Object.defineProperty(obj, "newKey", {
    value: "hello",
    configurable: true
  });
  // 刪除屬性
  delete obj.newKey;
  console.log( obj.newKey ); //undefined
  
  // 第二種情況:configurable設(shè)置為false,不能被刪除。
  Object.defineProperty(obj, "newKey", {
    value: "hello",
    configurable: false
  });
  // 刪除屬性
  delete obj.newKey;
  console.log( obj.newKey ); //hello
  
//-----------------測(cè)試是否可以再次修改特性------------------------
  var obj = {}
  
  //第一種情況:configurable設(shè)置為false,不能再次修改特性。
  Object.defineProperty(obj, "newKey", {
    value: "hello",
    writable: false,
    enumerable: false,
    configurable: false
  });
  //重新修改特性
  Object.defineProperty(obj, "newKey", {
    value: "hello",
    writable: true,
    enumerable: true,
    configurable: true
  });
  console.log( obj.newKey ); //報(bào)錯(cuò):Uncaught TypeError: Cannot redefine property: newKey
  
  //第二種情況:configurable設(shè)置為true,可以再次修改特性。
  Object.defineProperty(obj, "newKey", {
    value: "hello",
    writable: false,
    enumerable: false,
    configurable: true
  });
  //重新修改特性
  Object.defineProperty(obj, "newKey", {
    value: "hello",
    writable: true,
    enumerable: true,
    configurable: true
  });
  console.log( obj.newKey ); //hello
2.2 enumerable 屬性

此屬性是否可以被枚舉(使用for...in或Object.keys())默認(rèn)為false

設(shè)置為true可以被枚舉;設(shè)置為false,不能被枚舉

  var obj = {}
  
  // 第一種情況:enumerable設(shè)置為false,不能被枚舉。
  Object.defineProperty(obj, "newKey", {
    value: "hello",
    writable: false,
    enumerable: false
  });
  // 枚舉對(duì)象的屬性
  for( var attr in obj ){
    console.log( attr );  // undefined
  }
  
  // 第二種情況:enumerable設(shè)置為true,可以被枚舉。
  Object.defineProperty(obj, "newKey", {
    value: "hello",
    writable: false,
    enumerable: true
  });
  // 枚舉對(duì)象的屬性
  for( var attr in obj ){
  console.log( attr );  //newKey
  }
2.3 value 屬性

屬性對(duì)應(yīng)的值,可以是任意類型的值,默認(rèn)為undefined;

  var obj = {}
  // 第一種情況:不設(shè)置value屬性
  Object.defineProperty(obj, "key", {});
  console.log( obj.key );  //undefined
  
  // 第二種情況:設(shè)置value屬性
  Object.defineProperty(obj, "key", {
    value: "hello"
  });
  console.log( obj.key );  //hello
  
  // 同字面定義的數(shù)據(jù)值對(duì)應(yīng)
2.4 writable 屬性

屬性的值是否可以被重寫。默認(rèn)為false

設(shè)置為true可以被重寫;設(shè)置為false,不能被重寫

  var obj = {}
  
  // 第一種情況:writable設(shè)置為false,不能重寫。
  Object.defineProperty(obj, "newKey", {
    value: "hello",
    writable: false
  });
  // 更改newKey的值
  obj.newKey = "change value";
  console.log( obj.newKey );  //hello
  
  // 第二種情況:writable設(shè)置為true,可以重寫
  Object.defineProperty(obj, "newKey", {
    value: "hello",
    writable: true
  });
  // 更改newKey的值
  obj.newKey = "change value";
  console.log( obj.newKey );  //change value
2.5 默認(rèn)值理解(重點(diǎn))

在調(diào)用 Object.defineProperty 方法給對(duì)象添加屬性時(shí),如果不指定,configurable、enumerable、writable這些值都為默認(rèn)的false

==> 使用 Object.getOwnPropertyDescriptor() 方法來查看對(duì)象的內(nèi)置屬性

  var obj = {};
  
  // 第一種情況:使用 Object.defineProperty() 定義屬性
  Object.defineProperty(obj, "key", {
    value: "hello"
  });
  Object.getOwnPropertyDescriptor(obj, "key");
  // {value: "hello", writable: false, enumerable: false, configurable: false}
  
  // 第二種情況:字面量方式
  obj.key = "hello";
  Object.getOwnPropertyDescriptor(obj, "key");
  // {value: "hello", writable: true, enumerable: true, configurable: true}
2.6 數(shù)據(jù)屬性總結(jié)

configurable: 目標(biāo)屬性是否可以被刪除或是否可以再次修改特性 true | false

enumerable: 目標(biāo)屬性是否可以被枚舉。true | false

value: 設(shè)置屬性的值 undefined

writable: 值是否可以重寫。true | false

3. 內(nèi)置對(duì)象—訪問器屬性

Object.getOwnPropertyDescriptor()方法介紹(摘自MDN)

Object.getOwnPropertyDescriptor() 方法返回指定對(duì)象上一個(gè)自有屬性對(duì)應(yīng)的屬性描述符。(自有屬性指的是直接賦予該對(duì)象的屬性,不需要從原型鏈上進(jìn)行查找的屬性)

語法:Object.getOwnPropertyDescriptor(obj, prop)
參數(shù):
(1)obj:需要被操作的目標(biāo)對(duì)象
(2)prop:目標(biāo)對(duì)象內(nèi)屬性名稱(String類型)
返回:如果指定的屬性存在于對(duì)象上,則返回其屬性描述符對(duì)象(property descriptor),否則返回 undefined

3.1 configurable 屬性

參照數(shù)據(jù)屬性中的configurable屬性

3.2 enumerable 屬性

參照數(shù)據(jù)屬性中的enumerable屬性

3.3 get 方法

在讀取屬性是調(diào)用的函數(shù),默認(rèn)值為undefined

  var obj = {}, value = "hello";
  
  Object.defineProperty(obj, "key", {
    get: function() {
      console.log("獲取obj.key的值上下文");
      return value;
    }
  });
  
  console.log(obj.key); // "獲取obj.key的值上下文" hello
  obj.key = "new value";
  console.log(obj.key); // "獲取obj.key的值上下文" hello
3.4 set 方法

在寫入屬性時(shí)調(diào)用的函數(shù),默認(rèn)值為undefined

  // 一般不會(huì)多帶帶為屬性設(shè)置set而不設(shè)置get
  var obj = {}, value = "hello";
  Object.defineProperty(obj, "key", {
    set: function(val) {
      console.log("設(shè)置obj.key的值上下文");
    }
  });
  
  obj.key = "new value"; // "獲取obj.key的值上下文"
  console.log(obj.key); // undefined
不一定非要同時(shí)指定getter和setter。只指定getter意味著屬性是不能寫,嘗試寫入屬性會(huì)被忽略。在嚴(yán)格模式下,嘗試寫入只指定getter函數(shù)的屬性會(huì)拋出錯(cuò)誤。類似的,只指定setter函數(shù)的屬性也不能讀,否則在非嚴(yán)格模式下會(huì)返回undefined,而在嚴(yán)格模式下會(huì)拋出錯(cuò)誤。
  var book = {
    _year: 2004,
    edition: 1 };
  Object.defineProperty(book, "year", {
      get: function() {
        return this._year;
      },
      set: function(newValue) {
        if (newValue > 2004) {
          this._year = newValue;
          this.edition += newValue - 2004;
        }
      }
  });
  book.year = 2005; alert(book.edition); //2

使用訪問器屬性的常見方式,即設(shè)置一個(gè)屬性的值會(huì)導(dǎo)致其他屬性發(fā)生變化

3.5 數(shù)據(jù)和視圖聯(lián)動(dòng)(重點(diǎn))

給對(duì)象o定義新的屬性b,并且定義屬性b的get和set方法,當(dāng)o.b的時(shí)候會(huì)調(diào)用b屬性的get方法,給b屬性賦值的時(shí)候,會(huì)調(diào)用set方法,這就是修改數(shù)據(jù)的時(shí)候,視圖會(huì)自動(dòng)更新的關(guān)鍵前端獲取數(shù)據(jù)后,需要根據(jù)數(shù)據(jù)操作dom,視圖變化后,需要修改不少代碼,有沒有方法將數(shù)據(jù)和dom操作隔離,看一個(gè)例子

  
  

你好,

  // 視圖控制器
  var userInfo = {};
  Object.defineProperty(userInfo, "nickName", {
    get: function(){
      return document.getElementById("nickName").innerHTML;
    },
    set: function(nick){
      document.getElementById("nickName").innerHTML = nick;
    }
  });
  Object.defineProperty(userInfo, "introduce", {
    get: function(){
      return document.getElementById("introduce").innerHTML;
    },
    set: function(introduce){
      document.getElementById("introduce").innerHTML = introduce;
    }
  });
  
  // 數(shù)據(jù)
  // todo 獲取用戶信息的代碼
  // ....
  userInfo.nickName = "xxx";
  userInfo.introduce = "我是xxx,我來自云南,..."

訪問器屬性是實(shí)現(xiàn)MVVM框架的核心原理哦~

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

語法:Object.defineProperties(obj, props)
參數(shù):
(1)obj:在其上定義或修改屬性的對(duì)象
(2)props:要定義其可枚舉屬性或修改的屬性描述符的對(duì)象。對(duì)象中存在的屬性描述符主要有數(shù)據(jù)描述符和訪問器描述符兩種
返回:傳遞給函數(shù)的對(duì)象

  var obj = {};
  Object.defineProperties(obj, {
    "property1": {
      value: true,
      writable: true
    },
    "property2": {
      value: "Hello",
      writable: false
    }
    // etc. etc.
  });

參考:
Javascript中的Object.defineProperty
MDN Object.defineProperty
MDN Object.getOwnPropertyDescriptor

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89413.html

相關(guān)文章

  • JavaScript高級(jí)程序設(shè)計(jì)-摘要筆記-2

    摘要:說明此摘要筆記系列是我最近看高級(jí)程序設(shè)計(jì)第版隨手所記。其中,描述符對(duì)象的屬性必須是設(shè)置其中一個(gè)或多個(gè)值,可以修改對(duì)應(yīng)的特性值。如支持的瀏覽器,可以取得指定屬性的描述符。 說明: 此摘要筆記系列是我最近看《JavaScript高級(jí)程序設(shè)計(jì)(第3版)》隨手所記。里面分條列舉了一些我認(rèn)為重要的、需要記下的、對(duì)我有幫助的點(diǎn),是按照我看的順序來的。摘要筆記本身沒有系統(tǒng)性,沒有全面性可言,寫在這里...

    roland_reed 評(píng)論0 收藏0
  • 《你不知道的javascript筆記_對(duì)象&原型

    摘要:上一篇你不知道的筆記寫在前面這是年第一篇博客,回顧去年年初列的學(xué)習(xí)清單,發(fā)現(xiàn)僅有部分完成了。當(dāng)然,這并不影響年是向上的一年在新的城市穩(wěn)定連續(xù)堅(jiān)持健身三個(gè)月早睡早起游戲時(shí)間大大縮減,學(xué)會(huì)生活。 上一篇:《你不知道的javascript》筆記_this 寫在前面 這是2019年第一篇博客,回顧去年年初列的學(xué)習(xí)清單,發(fā)現(xiàn)僅有部分完成了。當(dāng)然,這并不影響2018年是向上的一年:在新的城市穩(wěn)定、...

    seasonley 評(píng)論0 收藏0
  • Javascript 設(shè)計(jì)模式讀書筆記(二)——封裝,簡(jiǎn)單的創(chuàng)建對(duì)象模式

    摘要:創(chuàng)建對(duì)象中,創(chuàng)建對(duì)象的基本模式有三種。因此,在設(shè)計(jì)構(gòu)造函數(shù)時(shí),需要進(jìn)行慎重考慮。因此在中,這種問題被稱作繼承破壞封裝。靜態(tài)成員每個(gè)只有一份,直接通過類對(duì)象進(jìn)行訪問。 什么是封裝 找工作時(shí)一些公司給了offer后我就想知道真正拿到手的是多少,畢竟賦稅繁重。但各種稅也好,五險(xiǎn)一金也好我實(shí)在是弄不清楚,于是我就會(huì)在網(wǎng)上的一些稅后收入計(jì)算器上進(jìn)行計(jì)算,只需要填寫一些基本信息,比如稅前收入,所...

    lentrue 評(píng)論0 收藏0
  • 讀《javaScript高級(jí)程序設(shè)計(jì)-第6章》之理解對(duì)象

    摘要:把對(duì)象定義為無序?qū)傩缘募?,其屬性可以包含基本值?duì)象或函數(shù)。接受兩個(gè)參數(shù)屬性所在的對(duì)象和要讀取其特性的屬性名返回的時(shí)其特性的對(duì)象例如讀高級(jí)程序設(shè)計(jì)這本書的第章面向?qū)ο蟮某绦蛟O(shè)計(jì),我做了篇筆記。這是第一篇,后面還有兩篇,分別是封裝類和繼承。 ECMA-262把對(duì)象定義為:無序?qū)傩缘募希鋵傩钥梢园局?、?duì)象或函數(shù)。所以,我們可以理解對(duì)象就是名值對(duì)的集合,名就是對(duì)象的每個(gè)屬性的名字,...

    KoreyLee 評(píng)論0 收藏0
  • JavaScript高級(jí)程序設(shè)計(jì)筆記:面向對(duì)象程序設(shè)計(jì)(六)

    摘要:在創(chuàng)建子類型的實(shí)例時(shí),不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)。實(shí)際上,應(yīng)該說是沒有辦法在不影響所有對(duì)象實(shí)例的情況下,給超類型的構(gòu)造函數(shù)傳遞參數(shù)。 面向?qū)ο蟮恼Z言有一個(gè)標(biāo)志,那就是它們都有類的概念,而通過類可以創(chuàng)建任意多個(gè)具有相同屬性和方法的對(duì)象。 理解對(duì)象 創(chuàng)建自定義對(duì)象的最簡(jiǎn)單的方法就是創(chuàng)建一個(gè)Object的實(shí)例,然后再為它添加屬性和方法。例如: var person = new Obje...

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

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

0條評(píng)論

閱讀需要支付1元查看
<