JavaScript 對象(下)

来源:https://www.cnblogs.com/lemonyam/archive/2019/04/11/10678856.html
-Advertisement-
Play Games

getter 和 setter: 1、ES5 里,屬性值可以用一個或兩個方法代替,這兩個方法就是 getter 和 setter,它們使用 get 和 set 進行定義而不是通過 function 2、由 getter 和 setter 定義的屬性稱作 “存取器屬性”,它不同於“數據屬性”,數據屬性 ...


getter 和 setter:

  1、ES5 里,屬性值可以用一個或兩個方法代替,這兩個方法就是 getter 和 setter,它們使用 get 和 set 進行定義而不是通過 function

  2、由 getter 和 setter 定義的屬性稱作 “存取器屬性”,它不同於“數據屬性”,數據屬性只有一個簡單的值

  3、當查詢存取器屬性的值時,JavaScript 調用 getter 方法(無參),並由它返回屬性存取表達式的值

  4、當設置一個存取器屬性的值時,JavaScript 調用 setter 方法,並將賦值表達式右側的值當作參數傳給 setter

let obj = {
    x: 1,
    y: 1,

    // 註意 getter 和 setter 沒有使用冒號,但函數體結束和下一個方法或數據屬性之間有逗號隔開
    // 設置一個可讀寫屬性 result
    get result() {
        return this.x+"+"+this.y+"i";
    },
    set result(arr) { // 需要參數
        if (arr.length != 2)
            throw RangeError();
        this.x = arr[0];
        this.y = arr[1];
    },

    // 設置一個只寫屬性 add
    set add(arr) {
        if (arr.length != 2)
            throw RangeError();
        this.x += arr[0];
        this.y += arr[1];
        return this.x+"+"+this.y+"i";
    }
}

console.log(obj.result);    // 使用 getter,輸出 1+1i
obj.add = [1, 2];   // 使用 setter
console.log(obj.result);    // 輸出 2+3i
obj.result = [3, 4];    
console.log(obj.result);    // 輸出 3+4i

註:讀取只寫屬性總是返回 undefined

 

屬性的特征:

  1、除了包含名字和值之外,屬性還包含一些標識它們可寫、可枚舉和可配置的特性

  2、數據屬性的 4 個特性:值、可寫性、可枚舉性和可配置性

  3、存取器特性:讀取、寫入、可枚舉和可配置

  4、數據屬性的描述符對象:value、writable、enumerable 和 configurable;存取器屬性則用 get 和 set 屬性代替 value 和 writable

  5、writable、enumerable 和 configurable 都是布爾值,而 get 和 set 是函數值

  6、通過 Object.getOwnPropertyDescriptor(obj, p) 可獲得某個對象特定屬性的屬性描述符

  7、通過 Object.defineProperty(obj, p, attr) 設置或新建屬性的特性,Object.defineProperties(obj, map) 修改或新建多個屬性特性

  8、Object.getOwnPropertyDescriptor() 和 Object.defineProperty() 都不能修改繼承來的屬性

// 通過 Object.getOwnPropertyDescriptor() 可獲得某個對象特定屬性的屬性描述符
console.log(Object.getOwnPropertyDescriptor({x: 1}, "x"));
console.log(Object.getOwnPropertyDescriptor({}, "toString"));   // undefined

// defineProperty(obj, p, attr) 設置、新建屬性
// defineProperties(obj, map)
let o = {};
// 新建多個屬性特性
Object.defineProperties(o, {
    x: {value: 1, writable: false, enumerable: true},
    y: {value: 2, enumerable: true},
    z: {value: 3, configurable: true, enumerable: true}
});
console.log(Object.getOwnPropertyDescriptor(o, "x"));
console.log(o.x);
// 把它修改成可修改的
Object.defineProperty(o, "x", {writable: true});
console.log(Object.getOwnPropertyDescriptor(o, "x"));

 

對象的三個屬性:

  1、原型屬性:在實例對象創建之初就設置好的,用來繼承屬性的,可通過將對象作為參數傳入 Object.getPrototypeOf() 來查詢它的原型

  2、類屬性:是一個字元串,用以表示對象的類型信息,只有一種間接方法可以查詢它(toString())

  3、可擴展性:用以表示是否可以給對象添加新屬性,通過將對象傳入 Object.isExtensible(),來判斷該對象是否可擴展;通過將對象傳入 Object.preventExtensions() 把其轉換為不可擴展(無法轉換回可擴展);Object.seal() 除了能將對象設置為不可擴展,還可以將對象的所有自有屬性都設置為不可配置;Object.isSealed() 來檢測對象是否封閉;Object.freeze() 將對象設置為不可擴展和屬性不可配置,同時將自有的所有數據屬性設置為只讀,存取器屬性(setter)不受影響

console.log(Object.getPrototypeOf(o));  // 輸出 o 的原型 {}
console.log(Object.prototype.toString.call(o).slice(8, -1)); // 輸出 "Object"
console.log(Object.prototype.toString.call([]).slice(8, -1));   // 輸出 "Array"
console.log(Object.isExtensible(o));    // 判斷對象 o 是否可擴展,輸出 true
Object.preventExtensions(o);    // 將對象轉換為不可擴展
console.log(Object.isExtensible(o));    // 輸出 false

 

序列化對象:

  1、我們可以將對象的狀態轉換為字元串,也可以將字元串還原為對象,ES5 提供了內置函數 JSON.stringify()JSON.parse() 來序列化和還原對象

  2、JSON 的語法是 JavaScript 語法的一個子集,它並不能表示 JavaScript 里所有的值

  3、JSON.stringify() 只能序列化對象可枚舉的自有屬性

// 若屬性里有不可枚舉的,則不把它進行轉換
let str = JSON.stringify(o);
// 輸出 contend: '{"x": 1, "y": 2, "z": 3}'   type: string
console.log("contend:", str, "\t type: ", typeof str);

let ser = JSON.parse(str);  // 轉換成對象
// 輸出 contend: {x: 1, y: 2, z: 3}   type: object
console.log("contend:", ser, "\t type: ", typeof ser);

 

對象方法:

  1、toString() 方法:無參,返回一個表示調用這個方法的對象值的字元串

  2、toLocaleString() 方法:返回一個表示這個對象的本地化字元串

  3、toJSON() 方法:如果在待序列化的對象中存在這個方法,則調用它,返回一個序列化結果,而不是原始對象

  4、valueOf() 方法:將對象轉換為某種原始值而非字元串

 

console.log(o.toString().slice(8, -1));
console.log(o.toLocaleString().slice(8, -1));
try {
    o.toJSON();
} catch(e) {
    // 若 toJSON 並未被定義,則會產生 TypeError
    console.log("TypeError");
}
console.log(o.valueOf());

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • import React, { Component } from 'react' import ReactDOM from 'react-dom' class App extends Component { constructor(props) { super(props); this.state ... ...
  • 示例代碼托管在: "http://www.github.com/dashnowords/blogs" 博客園地址: "《大史住在大前端》原創博文目錄" 華為雲社區地址: "【你要的前端打怪升級指南】" [TOC] 一. 任務說明 使用原生 繪製水球圖,這將是一個非常有意思的挑戰任務。水球圖是一種常見 ...
  • 本篇文檔主要是利用echarts實現可拖動節點的折現圖,在echarts中找到了一個demo,傳送門:https://echarts.baidu.com/examples/editor.html?c=line-draggable,但是不是用vue寫的,並且在改寫為vue組件的過程中遇到了很多問題,在 ...
  • 面試高頻之js的非同步載入 講這個問題之前, 我們從另一個面試高頻問題來切入, 我們的web頁面從開始解析到頁面渲染完成都經歷了什麼 ? 1 , 創建document對象, 開始解析頁面, 此時document.readyState = 'loading' 2 , 遇到link標簽引入的css文件, ...
  • 一. 框架 選用express框架 二. 簡單測試請求 在當前目錄新建index.js文件 複製代碼在終端輸入: node index.js 在瀏覽器中打開 127.0.0.1:3000 <! more 三.使用form上傳圖片 將index.js中的介面更新成 註意:index.js中的文件只要改 ...
  • 一、媒體(介)查詢 1.1 基本語法 媒體查詢由媒體類型和一個或多個檢測媒體特性的條件表達式組成。媒體查詢中可用於檢測的媒體特性有:width、height和color(等)。使用媒體查詢可以在不改變頁面內容的情況下,為特性的一些輸出設備定製顯示效果。 使用 @media 查詢,你可以針對不同的媒體 ...
  • CSS3的出現給網站頁面增加了活力,網站增色不少,有這麼小小的一款插件就能做出很多動畫效果。 最重要的是它:簡單易用、輕量級、無需 jQuery......他就是wow.js 地址:https://daneden.github.io/animate.css/ 也可以在這個地方看各種演示 下麵就讓我們 ...
  • 因為是Node伺服器端的,怎樣實現前臺和後臺請求以及回應 URL(由什麼組成的 ),傳輸的內容:表單數據 文件數據 【圖片、壓縮包、各種尾碼文件】 URL的組成 URL由三部分組成: 協議類型 , 主機名 和 路徑及文件名 。通過URL可以指定的主要有以下幾種:http、ftp、gopher、tel ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...