深入理解javascript對象系列第一篇——初識對象

来源:http://www.cnblogs.com/xiaohuochai/archive/2016/08/05/5741616.html
-Advertisement-
Play Games

× 目錄 [1]定義 [2]創建 [3]組成[4]引用 前面的話 javascript中的難點是函數、對象和繼承,前面已經介紹過函數系列。從本系列開始介紹對象部分,本文是該系列的第一篇——初識對象 對象定義 javascript的基本數據類型包括undefined、null、boolean、stri ...


×
目錄
[1]定義 [2]創建 [3]組成[4]引用

前面的話

  javascript中的難點是函數、對象和繼承,前面已經介紹過函數系列。從本系列開始介紹對象部分,本文是該系列的第一篇——初識對象

 

對象定義

  javascript的基本數據類型包括undefinednullbooleanstringnumber和object。對象和其他基本類型值不同的是,對象是一種複合值:它將許多值(原始值或者其他對象)聚合在一起,可通過名字訪問這些值

  於是,對象也可看做是屬性的無序集合,每個屬性都是一個名/值對。屬性名是字元串,因此我們可以把對象看成是從字元串到值的映射

  關於複合值和原始值的詳細區別移步至此

 

對象創建

  有以下三種方式來創建對象,包括new構造函數、對象直接量和Object.create()函數

【1】new構造函數

  使用new操作符後跟Object構造函數用以初始化一個新創建的對象

var person = new Object();
//如果不給構造函數傳遞參數可以不加括弧 var person = new Object;
person.name = 'bai';
person.age = 29;
//創建無屬性的空對象
var cody1 = new Object();
var cody2 = new Object(undefined);
var cody3 = new Object(null);
console.log(typeof cody1,typeof cody2, typeof cody3);//object object object

  如果該參數是一個對象,則直接返回這個對象 

var o1 = {a: 1};
var o2 = new Object(o1);
console.log(o1 === o2);// true

var f1 = function(){};
var f2 = new Object(f1);
console.log(f1 === f2);// true

  如果是一個原始類型的值,則返回該值對應的包裝對象

//String {0: "f", 1: "o", 2: "o", length: 3, [[PrimitiveValue]]: "foo"}
console.log(new Object('foo'));

//Number {[[PrimitiveValue]]: 1}
console.log(new Object(1));

//Boolean {[[PrimitiveValue]]: true}
console.log(new Object(true));

【2】對象字面量

  javascript提供了叫做字面量的快捷方式,用於創建大多數原生對象值。使用字面量只是隱藏了與使用new 操作符相同的基本過程,於是也可以叫做語法糖

  對象字面量是由若幹名/值對組成的映射表,名/值對中間用冒號分隔,整個映射表用花括弧括起來

  不同屬性之間用逗號分隔,屬性名可以是任意字元串,屬性值可以是任意類型表達式,表達式的值是屬性值

//等價於var person = new Object();
var person = {}; 
var person = {
    name : 'bai',
    age : 29,
    5 : true
};

  使用對象字面量的方法來定義對象,屬性名會自動轉換成字元串

//同上
var person = {
    'name' : 'bai',
    'age' : 29,
    '5' : true
}; 

  [註意]一般地,對象字面量的最後一個屬性後的逗號將忽略,但在IE7-瀏覽器中導致錯誤

//IE7-瀏覽器中報錯 SCRIPT1028: 缺少標識符、字元串或數字
var person = {
    name : 'bai',
    age : 29,
    5 : true,
};

【3】Object.create()

  ES5定義了一個名為Object.create()的方法,它創建一個新對象,第一個參數就是這個對象的原型,第二個可選參數用以對對象的屬性進行進一步描述

var o1 = Object.create({x:1,y:1}); //o1繼承了屬性x和y
console.log(o1.x);//1

  可以通過傳入參數null來創建一個沒有原型的新對象,但通過這種方式創建的對象不會繼承任何東西,甚至不包括基礎方法。比如toString()valueOf()

var o2 = Object.create(null); // o2不繼承任何屬性和方法
var o1 = {};
console.log(Number(o1));//NaN
console.log(Number(o2));//Uncaught TypeError: Cannot convert object to primitive value

  如果想創建一個普通的空對象(比如通過{}或new Object()創建的對象),需要傳入Object.prototype

var o3 = Object.create(Object.prototype); // o3和{}和new Object()一樣
var o1 = {};
console.log(Number(o1));//NaN
console.log(Number(o3));//NaN

   Object.create()方法的第二個參數是屬性描述符

var o1 = Object.create({z:3},{
  x:{value:1,writable: false,emumerable:true,configurable:true},
  y:{value:2,writable: false,emumerable:true,configurable:true}
}); 
console.log(o1.x,o1.y,o1.z);//1 2 3

 

對象組成

  對象是屬性的無序集合,由鍵名和屬性值組成

【鍵名】

  對象的所有鍵名都是字元串,所以加不加引號都可以,如果不是字元串也會自動轉換成字元串

var o = {
  'p': 'Hello World'
};
var o = {
  p: 'Hello World'
};
var o ={
  1: 'a',
  3.2: 'b',
  1e2: true,
  1e-2: true,
  .234: true,
  0xFF: true,
};
//Object {1: "a", 100: true, 255: true, 3.2: "b", 0.01: true, 0.234: true}
o;

  [註意]如果鍵名不符合標識符命名規則,則必須加上引號,否則會報錯

//Uncaught SyntaxError: Unexpected identifier
var o = {
    1p: 123
}

var o = {
    '1p': 123
}

【屬性值】

  屬性值可以是任何類型的表達式,最終表達式的結果就是屬性值的結果

var o ={
    a: 1+2
}
console.log(o.a);//3

  如果屬性值為函數,則通常把這個屬性稱為“方法”

var o = {
  p: function (x) {
    return 2 * x;
  }
};
o.p(1);//2

  由於對象的方法就是函數,因此也有name屬性。方法的name屬性返回緊跟在function關鍵字後面的函數名。如果是匿名函數,ES5環境會返回undefined,ES6環境會返回方法名

var obj = {
  m1: function f() {},
  m2: function () {}
};
obj.m1.name // "f"
obj.m2.name //ES5: undefined
obj.m2.name //ES6: "m2"

 

引用對象

  如果不同的變數名指向同一個對象,那麼它們都是這個對象的引用,也就是說指向同一個記憶體地址。修改其中一個變數,會影響到其他所有變數

var o1 = {};
var o2 = o1;

o1.a = 1;
console.log(o2.a);// 1
o2.b = 2;
console.log(o1.b);// 2

  如果取消某一個變數對於原對象的引用,不會影響到另一個變數

var o1 = {};
var o2 = o1;

o1 = 1;
console.log(o2);//{}

 

參考資料

【1】 W3School-Javascript高級教程——引用類型 http://www.w3school.com.cn/js/pro_js_referencetypes.asp
【2】 阮一峰Javascript標準參考教程——對象 http://javascript.ruanyifeng.com/grammar/object.html
【3】《javascript權威指南(第6版)》第6章 對象
【4】《javascript高級程式設計(第3版)》第5章 引用類型
【5】《javascript語句精粹》第3章 對象
【6】《javascript面向對象精要》 第3章 理解對象
【7】《你不知道的javascript上捲》第3章 對象


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

-Advertisement-
Play Games
更多相關文章
  • 序號 方法 舉例 是否改變當前數組 1 instanceof 判斷變數是否是數組對象 否 2 join 將數組的元素組起一個字元串 join(separator) //將數組的元素組起一個字元串,以separator為分隔符,省略的話則用預設用逗號為分隔符 arr1 = [1,2,3,4,5]; r ...
  • 一、引言 JavaScript的內容分為三個部分,這三個部分分別是ECMAScript、DOM、BOM三個部分組成。所謂ECMAScript就是JavaScript和核心基礎語法,DOM是文檔對象模型,最後剩下的BOM則是瀏覽器對象模型。這三個部分相輔相成組成了現在的JavaScript。 二、導入 ...
  • 在做WEB開發的時候我們經常會遇到分頁的處理,如果在PC上顯示網頁的話,使用傳統的分頁是可以接受的。那麼,當我們為手機或其他移動端設計界面的話,使用分頁未免有些笨拙和難以使用,這時候我們可以使用在單頁載入所有列表項。當屏幕滑動到最低端的時候,會出現“點擊載入更多”的按鈕,當我們點擊此按鈕的時候,會加 ...
  • 名字的聲明就是讓我的解釋器知道有這個名字 名字沒有任何數據與之對應 函數聲明包含兩部分 首先告訴解釋器函數的名字 告訴解釋器 這個名字對應的函數體是什麼 函數聲明與函數表達式有區別,函數聲明是單獨寫在一個結構中,不存在任何語句,邏輯判斷等結構中 ``` 函數聲明: function(){} func ...
  • 今天沒有說什麼內容,只是對HTML5的細節補充,如HTML結構的可以省略到最大的地步 沒有了基本的結構標簽了,瀏覽器會自動幫我們生成。 還有標簽的屬性的雙引號也可以省略; HTML5讓我體驗到它在最大化的簡化標簽,使代碼量最小化。 還有調試工具的使用,調試工具讓我們更快的更準確的查到各方面的信息, ...
  • <script> function lol(type) { if(typeof type == "undefined") { alert("undefined"); } else if(typeof type == "object") { if(new String(type) == "null") ...
  • 最近在這段時間瞭解了下redux,下麵簡單記錄下所得。 redux總結 首先,還是用幾句話簡單概括下redux吧,歡迎拍磚。 redux採用的函數式編程方式,基於單項數據流模式管理應用中的狀態。 一個複雜應用對應一個狀態樹,應用模塊之前共用的狀態都交由該狀態樹負責維護。 只能通過觸發action對象 ...
  • 本文記載boot 導航條組件使用方法 導航條組件 導航條是在您的應用或網站中作為導航頁頭的響應式基礎組件。它們在移動設備上可以摺疊(並且可開可關),且在視口(viewport)寬度增加時逐漸變為水平展開模式。 屏幕解析度變化時,頁面導航呈現不同效果,變小時會出現漢堡包按鈕,將頁面導航部分隱藏,以下拉 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...