JavaScript 對象(上)

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

簡述: 1、是 JavaScript 的基本類型 2、是一種複合值,可通過名字訪問這些值 3、可看作屬性的無序集合,每個屬性都是一個名/值對(屬性名是字元串或標識符) 4、可以從一個稱為原型的對象繼承屬性(核心特征) 5、是動態的,可新增或刪除屬性,操作對象是通過引用而不是值 6、屬性名可以是包含空 ...


簡述:

  1、是 JavaScript 的基本類型

  2、是一種複合值,可通過名字訪問這些值

  3、可看作屬性的無序集合,每個屬性都是一個名/值對(屬性名是字元串或標識符

  4、可以從一個稱為原型的對象繼承屬性(核心特征)

  5、是動態的,可新增或刪除屬性,操作對象是通過引用而不是值

  6、屬性名可以是包含空字元在內的任意字元串,但對象中不能存在兩個或多個同名屬性;非嚴格模式下允許,但後者會覆蓋前者的值

註:除了字元串、數字、true、false、null 和 undefined 之外,JavaScript 中的值都是對象

 

原型:

  1、大部分 JavaScript 對象都和另一個對象(原型)相關聯,每個對象都從原型繼承屬性

  2、可以通過 JavaScript 代碼 Object.prototype 獲得對其原型對象的引用

  3、所有通過對象直接量創建的對象都具有同一個原型對象,使用相同構造函數的對象也具有同一個原型對象

  4、所有的內置構造函數(以及大部分自定義的構造函數)都具有一個繼承自 Object.prototype 的原型

  5、一個普通對象的原型可能也有原型,而這一系列鏈接的原型對象就是”原型鏈

 

創建對象:

  1、對象直接量:由若幹名/值對組成的映射表,名/值對中間用冒號分隔,名/值對之間用逗號分隔,整個映射表用花括弧括起來

// 對象裡面的屬性值可以是對象
let obj = {"name": "Yam", "other": {"weight": "yyy", "high": "xxx"}, "age": 200};
console.log(obj["other"]["high"]);  // 輸出 xxx
console.log(obj.other.high);

註:對象直接量是一個表達式,這個表達式的每次運算都創建並初始化一個新的對象

 

  2、關鍵字 new:關鍵字後跟隨一個函數(構造函數)調用,用以初始化一個新創建的對象

let arr = new Array();    // 創建一個空數組
let date = new Date();    // 創建一個表示當前時間的 Date 對象

 

  3、Object.create(proto [, more]):創建一個新對象,第一個參數為這個對象的原型,第二個參數可對對象的屬性進行進一步描述

// ES5 定義的
let obj = Object.create({"x": 1, "y": 2});
console.log(obj.x);  // 輸出 1

 

屬性查詢和設置:

// inherit 函數來自 JavaScript 權威指南

function inherit(p) {
    if (p == null)
        throw TypeError();
    if (Object.create)
        return Object.create(p);
    let t = typeof p;
    if (t != "object" && t != "function")
        throw TypeError();
    function f() {};    // 定義一個空構造函數
    f.prototype = p;
    return new f(); // 使用 f() 創建 p 的繼承對象
}

let o = {};
o.x = 1;
let p = inherit(o);
p.y = 2;
// 屬性賦值操作首先會檢查原型鏈,以此判斷是否允許賦值
// 賦值時也只是在原始對象上創建屬性或對已有屬性賦值,而不會修改原型鏈
// 屬性賦值要麼失敗,要麼創建一個屬性,要麼在原始對象中設置屬性
p.x = 3;
console.log(o.x);   // 輸出 1
// 屬性訪問可以通過點或方括弧來操作
console.log(p["x"] + p.y);  // 輸出 5

// 非嚴格模式下查詢一個不存在的屬性並不會報錯
console.log(p.z);   
// 但如果對象本身不存在,那麼查詢這個不存在的對象的屬性就會報錯(undefined、null)
// console.log(p.z.i);    // 報錯

註: 1、不能給只讀屬性重新賦值

   2、不能通過同名自有屬性覆蓋只讀的繼承屬性

   3、如果對象 obj 不可擴展,那麼不能在 obj 中定義新屬性

 

刪除屬性:

   1、delete 運算符可以刪除對象的屬性,但只是斷開屬性和宿主對象的聯繫,而不會去操作屬性中的屬性

  2、delete 運算符只能刪除自有屬性,而不能刪除繼承屬性

  3、delete 刪除成功或者沒有任何副作用時,它返回 true;若它後面不是一個屬性訪問表達式,同樣會返回 true!!!

  4、不能刪除那些可配置性為 false 的屬性,但可以刪除不可擴展對象的可配置屬性,非嚴格模式下返回 false,嚴格模式報錯

let par = {"q": 10};
let a = Object.create(par);
a.p = {"x": 1};
let b = a.p;
delete a.p; // delete 只斷開屬性和宿主對象的聯繫,而不會去操作屬性中的屬性,可能會造成記憶體泄漏
console.log(b.x);   // 輸出 1

console.log(delete a.q);    // 什麼也沒做,輸出 true
console.log(a.q);   // 輸出 10
console.log(delete a.t);    // 輸出 true
console.log(delete 20); // 輸出 true

console.log(delete Object.prototype);   // 輸出 false
console.log(delete b);  // 刪除一個通過變數聲明或函數聲明(var 和 let)的對象會返回 false

 

檢測屬性:

  1、運算符 in:左側為屬性名,右側為對象,若對象的自有屬性或繼承屬性中包含這個屬性,則返回 true

  2、hasOwnProperty() 方法:檢測給定屬性是不是對象的自有屬性

  3、propertyIsEnumerable() 方法:檢測屬性是不是自有屬性且可枚舉

// 若對象的自有屬性或繼承屬性中包含這個屬性,則返回 true
let ino = {"x": 1};
console.log("x" in ino);    // true
console.log("toString" in ino); // true
console.log("y" in ino);    // false

// 檢測給定屬性是不是對象的自有屬性
console.log(ino.hasOwnProperty("toString"));    // false

// 檢測屬性是不是自有屬性且可枚舉
console.log(ino.propertyIsEnumerable("x")); // true
console.log(Object.prototype.propertyIsEnumerable("toString"));  // 不可枚舉,false

註:可以使用 "attr !== undefined;" 來判斷屬性是否存在,但若屬性存在且值為 undefined,則只能使用 in

 

枚舉屬性:

  1、for/in 迴圈可以在迴圈體中遍歷對象中所有可枚舉的屬性(包括自有屬性和繼承屬性),並把屬性名賦值給迴圈變數

  2、ES5 定義了 Object.keys(),它返回一個由對象中可枚舉的自有屬性的名稱組成的數組

  3、ES5 定義了 Object.getOwnPropertyNames(),它返回對象的所有自有屬性的名稱,而不僅僅是可枚舉屬性

 

let foro = {"x": 1, "y": 2};
for (let temp in foro)
    console.log(temp);  // 輸出 x y
console.log(Object.keys(foro)); // 輸出 ['x', 'y']
console.log(Object.getOwnPropertyNames(Object.prototype));

 


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

-Advertisement-
Play Games
更多相關文章
  • AWZ愛偽裝 是一款通用的一鍵新機軟體,主要用於對應用偽裝設備參數和清理應用數據,它功能強大,設置豐富,且擁有完整的隨機參數設置、全息備份、虛擬定位功能;支持蘋果iOS越獄設備,不支持安卓系統;暫時支持ios7、8、9、10、11越獄系統,暫時不支持ios11.4之後的越獄(含ios11.4越獄系統 ...
  • 實際上我們通常是使用WebView控制項對本地html進行讀取,這樣就可以體會類似web app和安卓原生混合開發的樂趣了。在讀取本地html並展示在前臺的時候,並不需要在Androidmenifast.xml文件當中設置相應的網路許可權,也不需要設置https協議,因為安卓手機的本地伺服器應該都是基於 ...
  • 文章大綱 一、greenDao簡介二、greenDao實戰三、項目源碼下載四、參考文章 一、greenDao簡介 1. 什麼是greenDao GreenDAO是一個開源的Android ORM(“對象/關係映射”),通過ORM(稱為“對象/關係映射”),在我們資料庫開發過程中節省了開發時間。 2. ...
  • 方法如下: 因為在用WebView控制項查看安卓內置網頁的時候,必須創建這個資源文件夾,將網頁放置在這個目錄之下,預設是沒有assets這個目錄的,這樣才可以實現網頁代碼html.css.javascript與Android native的交互,所以我們來看一看怎麼做。很簡單,但不知道就做不來。讀取本 ...
  • 導入 #import <objc/runtime.h> unsigned int count; Method *methods = class_copyMethodList([UIAlertAction class], &count); for (int i = 0; i < count; i++) ...
  • Android許可權 Android安全架構規定:預設情況下,任何應用都沒有許可權執行對其他應用、操作系統或用戶有不利影響的任何操作。這包括讀寫用戶的私有數據(聯繫人,簡訊,相冊,位置)、讀寫其他應用的文件、執行網路訪問、使設備保持喚醒狀態等等。 如果是一些正常的許可權(非高危許可權),比如網路訪問等在應用 ...
  • - (UIImage *)dtk_setImageColor:(UIColor *)imageColor{ //獲取畫布 UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0f); //畫筆沾取顏色 [imageColor setFill... ...
  • 想要相容IE678,少用原型,因為它們沒有完全實現ECMA-262規範 測試代碼 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...