JavaScript淺嚐紀錄No.5-呈現真實世界的物件該如何運用?

更新 發佈閱讀 12 分鐘

物件(Object)

MDN中如此介紹:

物件是一批相關的數據以及/或者功能,可裝載相關的資料與程式碼,資料部分是你塑造某個模型的資訊,而程式碼部分則用是操作行為(Method)實現。Object data – 函式部分通常也使用 —可工整地儲存 (正式一點應該是封裝 Encapsulated) 在物件包裹(這個包裹有特定的稱呼方式,有時候即所謂的命名空間 Namespace) ,使其能輕鬆地建構性存取。物件也常作為「資料儲存 (Datastore),促成簡易實現跨網傳送。。

物件表示法

在物件中,屬性代表靜態的資料,用於描述物件的狀態;**方法(函式)**代表物件的功能,或說物件的行為。

raw-image

物件實字

  • 利用`{}`創建物件。
let person = {} //空物件
let person = {
name: 'Bob',
age: 32,
gender: 'male',
interests: ['music', 'skiing'],
greeting: function () {
console.log('Hi! I\'m ' + this.name[0] + '.');
}
} //直接在{}中寫下key-value pair的值


  • 可以透過**點記法(Dot notation)**或是**括弧記法(Bracket notation)**存取物件的屬性與函式。

以上面的`person`物件來當例子:

//點記法
//括弧記法,記得使用['key']取值時,key一定要加''
console.log(person.name) //取得姓名值 "Bob"
console.log(person['name']) //取得姓名值 "Bob"
person.age = 45 //更改年齡值為 45
person['age'] = 45 //更改年齡值為 45
console.log(person.name) //取得年齡值 45
console.log(person['age']) //取得年齡值 45

//物件中包含物件,如何取值
let person = {
name: {
first: 'Bob',
last: 'Smith'
},
}
console.log(person.name.last) //取得姓名last值'Smith'
console.log(person['name']['last']) //取得姓名last值'Smith'
person.name.first = 'Cratchit' //更改姓名first值'Cratchit'
person['name']['first'] = 'Cratchit'//更改姓名first值'Cratchit'
console.log(person.name.first) //取得姓名first值'Cratchit'
console.log(person['name']['first']) //取得姓名first值'Cratchit'

建構函式(constructor function)

高效率的建構擁有相同屬性或方法的物件,即是用多個物件類別建置相同功能,並且使用`new`關鍵字來呼叫建構函式。

建構函式名稱往往以大寫字母起頭,如此可方便在程式碼中找出建構函式。

寫法如下:

//利用function創建物件基本架構
function ConstructorName(parameter) {
this.propertyName = value;//可以帶入參數
this.methodName= function() {
console.log('Hi! I\'m ' + this.name + '.');
};
}

//範例
function Person(name) {
this.name = name;
this.greeting = function() {
console.log('Hi! I\'m ' + this.name + '.');
};
}

在上面程式碼中的`this`代表著物件擁有者,誰使用了這個建構函式,那麼這個`this`就指向他。

看一下下面的程式碼,先利用關鍵字`new`及建構函式來創建新的物件,就能明白`this`指向誰了。

let Bob = new Person('Bob')
console.log(Bob)
//創建出了變數名為Bob的物件,類似下方程式碼(但在程式碼中並不會顯示,可用console.log()顯示)
let Bob = {
name : 'Bob',
greeting : function () {
console.log('Hi! I\'m ' + this.name + '.') //這時候的this指向的就是Bob
},
}

let Sarah = new Person('Sarah')
console.log(Sarah) //這時候的this指向的就是Sarah

點記法(Dot notation)v.s括弧記法(Bracket notation)

1. 括弧記法可以利用**變數**作為屬姓名取值,點記法不行,並且會出現`undefined`。

let obj = {}
let tall= "height"
let tallVal = 160

////括弧記法
obj[tall] = tallVal
console.log(obj[tall]) //160

//點記法
console.log(obj.tall) //undefined

2. 括弧記法可以利用數字做為屬姓名,點記法不行,會出現`Uncaught SyntaxError: Unexpected numbe`。

let obj = {}

//括弧記法
obj[2] = 2
console.log(obj[2]) //2

//點記法
obj.2 = 2 //Uncaught SyntaxError: Unexpected number

3. 括弧記法可以動態(如加減)的設定變數名,點記法不行,會出現`Uncaught SyntaxError: Unexpected template string`。

let obj = {}
let nation = ['USA', 'UK', 'Thailand', 'Netherlands']

//括弧記法
for (let i = 0; i < nation.length; i++) {
obj[`nation ${i+1}`] = nation[i]
}
console.log(obj) // {nation 1: "USA", nation 2: "UK", nation 3: "Thailand", nation 4: "Netherlands"}

//點記法
for (let i = 0; i < nation.length; i++) {
obj.`nation ${i+1}` = nation[i]
}
console.log(obj) // Uncaught SyntaxError: Unexpected template string

物件方法應用

Object.assign() 複製物件

寫法`Object.assign(target, ...sources)`,`target`需要複製的物件,`sources`複製的來源(被複製的物件)。

  • 基本款
const obj = {
a: 1,
b: 2,
c: 3
}

const copyObj = Object.assign({}, obj) //把obj複製給空物件{}
console.log(obj) //{a: 1, b: 2, c: 3}
console.log(copyObj)//{a: 1, b: 2, c: 3}
console.log(obj===copyObj)//false
  • 複雜款
    • 複製來源(`sources`)有許多個,並且`source`裡有相同的key值,那麼複製時,後面來源會將前面來源的value值覆蓋掉。
const obj1 = {
a: 1,
b: 2,
c: 3
}

const obj2 = {
b: 4,
c: 5
}

const copyObj = Object.assign({}, obj1, obj2) //將obj1, obj2複製給空物件{}
console.log(obj1) //{a: 1, b: 2, c: 3}
console.log(obj2) //{b: 4, c: 5}
console.log(copyObj) //{a: 1, b: 4, c: 5} 複製時obj2會將obj1中相同key的value值覆蓋掉,所以b跟c會是obj2的值
    • 複製來源(`sources`)物件值是物件包裹子物件的話,`Object.assign()`只會複製該子物件的參照位址,如果要讓相同內容的物件(有子物件)有新的參照位址可以參考`JSON.parse(JSON.stringify())`的作法。
let a = {
b: {
c: 4
},
d: {
e: {
f: 1
}
}
}

let g = Object.assign({}, a) // 淺層複製
let h = JSON.parse(JSON.stringify(a)); // 深層複製
console.log(a=== g) //false,a、g指向不同參照位址,但裡面的子物件指向相同的位址。
console.log(a=== h)//false,a、h(及裡面的子物件)指向不同參照位址。
console.log(g.d.e === a.d.e) // true,淺層複製,b、d、e都是複製參照位址所以值為相同。
console.log(h.d.e === a.d.e) // false,深層複製,b、d、e指向不同的參照位址。
raw-image


    • 複製的target會被sources影響。
const obj1 = {
a: 1,
b: 2,
c: 3
}

const obj2 = {
b: 4,
c: 5
}

const copyObj = Object.assign(obj1, obj2)//這時的obj1與copyObj是相同的
console.log(obj1) //{a:1,b:4,c:5}
console.log(copyObj) //{a:1,b:4,c:5}
console.log(obj1===copyObj) //true


參考資料:

MDN-JavaScript 物件基礎概念

MDN-初學者應知道的物件導向 JavaScript

JavaScript中物件屬性通過點(.)和方括號([])取值的不同之處

w3school-JavaScript this 关键词

MDN-Object

留言
avatar-img
鍋灶的熱湯
0會員
12內容數
分享生活、旅行經驗,經驗是種解決問題的方式,方式不只一種歡迎大家一起分享經驗
鍋灶的熱湯的其他內容
2026/03/05
let array = [0,1,2,3,4] array.unshift(5) //在第一個位置加入5,原陣列值往後移動1個位置 console.log(array) //[5,0,1,2,3,4]資料結構 (data structure) 資料結構是電腦中儲存、組織資料的方式, 陣列資料結構
Thumbnail
2026/03/05
let array = [0,1,2,3,4] array.unshift(5) //在第一個位置加入5,原陣列值往後移動1個位置 console.log(array) //[5,0,1,2,3,4]資料結構 (data structure) 資料結構是電腦中儲存、組織資料的方式, 陣列資料結構
Thumbnail
2026/03/03
ECMAScript標準定義的七種資料型別 基本型別 (primitive type) String-字串”hello”。 Number-數字 (在 -(253 -1) and 253 -1 之間的數字), +Infinity、-Infinity、NaN也是數字型別。  Boolean-布林
2026/03/03
ECMAScript標準定義的七種資料型別 基本型別 (primitive type) String-字串”hello”。 Number-數字 (在 -(253 -1) and 253 -1 之間的數字), +Infinity、-Infinity、NaN也是數字型別。  Boolean-布林
2026/03/03
宣告變數、賦值 (assign) 變數的作用 為什麼要使用變數,原因其實很簡單,就是為了不要重複打同樣的一大串程式碼,更簡單的說就是懶,所以創造變數讓它去記得想讓它去記得的東西(同樣的一大串程式碼)。 變數的命名是有規則的 需要注意的事項 變數的名稱被稱為 identifiers 需要遵從
2026/03/03
宣告變數、賦值 (assign) 變數的作用 為什麼要使用變數,原因其實很簡單,就是為了不要重複打同樣的一大串程式碼,更簡單的說就是懶,所以創造變數讓它去記得想讓它去記得的東西(同樣的一大串程式碼)。 變數的命名是有規則的 需要注意的事項 變數的名稱被稱為 identifiers 需要遵從
看更多
你可能也想看
Thumbnail
賽勒布倫尼科夫以流亡處境回望蘇聯電影導演帕拉贊諾夫的舞台作品,以十段寓言式殘篇,重新拼貼記憶、暴力與美學,並將審查、政治犯、戰爭陰影與「形式即政治」的劇場傳統推到台前。本文聚焦於《傳奇:帕拉贊諾夫的十段殘篇》的舞台美術、音樂與多重扮演策略,嘗試解析極權底下不可言說之事,將如何成為可被觀看的公共發聲。
Thumbnail
賽勒布倫尼科夫以流亡處境回望蘇聯電影導演帕拉贊諾夫的舞台作品,以十段寓言式殘篇,重新拼貼記憶、暴力與美學,並將審查、政治犯、戰爭陰影與「形式即政治」的劇場傳統推到台前。本文聚焦於《傳奇:帕拉贊諾夫的十段殘篇》的舞台美術、音樂與多重扮演策略,嘗試解析極權底下不可言說之事,將如何成為可被觀看的公共發聲。
Thumbnail
柏林劇團在 2026 北藝嚴選,再次帶來由布萊希特改編的經典劇目《三便士歌劇》(The Threepenny Opera),導演巴里・柯斯基以舞台結構與舞台調度,重新向「疏離」進行提問。本文將從觀眾慾望作為戲劇內核,藉由沉浸與疏離的辯證,解析此作如何再次照見觀眾自身的位置。
Thumbnail
柏林劇團在 2026 北藝嚴選,再次帶來由布萊希特改編的經典劇目《三便士歌劇》(The Threepenny Opera),導演巴里・柯斯基以舞台結構與舞台調度,重新向「疏離」進行提問。本文將從觀眾慾望作為戲劇內核,藉由沉浸與疏離的辯證,解析此作如何再次照見觀眾自身的位置。
Thumbnail
本文深入解析臺灣劇團「晃晃跨幅町」對易卜生經典劇作《海妲.蓋柏樂》的詮釋,從劇本歷史、聲響與舞臺設計,到演員的主體創作方法,探討此版本如何讓經典劇作在當代劇場語境下煥發新生,滿足現代觀眾的觀看慾望。
Thumbnail
本文深入解析臺灣劇團「晃晃跨幅町」對易卜生經典劇作《海妲.蓋柏樂》的詮釋,從劇本歷史、聲響與舞臺設計,到演員的主體創作方法,探討此版本如何讓經典劇作在當代劇場語境下煥發新生,滿足現代觀眾的觀看慾望。
Thumbnail
《轉轉生》為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,融合舞蹈、音樂、時尚和視覺藝術,透過身體、服裝與群舞結構,回應殖民歷史、城市經驗與祖靈記憶的交錯。本文將從服裝設計、身體語彙與「輪迴」的「誕生—死亡—重生」結構出發,分析《轉轉生》如何以當代目光,形塑去殖民視角的奈及利亞歷史。
Thumbnail
《轉轉生》為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,融合舞蹈、音樂、時尚和視覺藝術,透過身體、服裝與群舞結構,回應殖民歷史、城市經驗與祖靈記憶的交錯。本文將從服裝設計、身體語彙與「輪迴」的「誕生—死亡—重生」結構出發,分析《轉轉生》如何以當代目光,形塑去殖民視角的奈及利亞歷史。
Thumbnail
學習程式設計不再困難!本文提供一份循序漸進的 JavaScript 教學,每天只需 10 分鐘,就能從基礎語法到專案實作,逐步學習網頁開發,包含 HTML、CSS、JavaScript、DOM 操作、Canvas 等,並以 Road Map 呈現學習進度。即使零基礎也能輕鬆入門,開啟程式設計之路。
Thumbnail
學習程式設計不再困難!本文提供一份循序漸進的 JavaScript 教學,每天只需 10 分鐘,就能從基礎語法到專案實作,逐步學習網頁開發,包含 HTML、CSS、JavaScript、DOM 操作、Canvas 等,並以 Road Map 呈現學習進度。即使零基礎也能輕鬆入門,開啟程式設計之路。
Thumbnail
在現代 Web 開發中,框架的規範性對於團隊合作至關重要。這不僅提高了程式碼的一致性,也降低了理解他人程式碼的時間成本。現在,我們將以 JavaScript 為例,展示如何使用關注點分離的原則來撰寫一個簡單的應用喔。
Thumbnail
在現代 Web 開發中,框架的規範性對於團隊合作至關重要。這不僅提高了程式碼的一致性,也降低了理解他人程式碼的時間成本。現在,我們將以 JavaScript 為例,展示如何使用關注點分離的原則來撰寫一個簡單的應用喔。
Thumbnail
如果你曾經撰寫過網頁,那你一定接觸過 JavaScript 無論是在 NodeJs 或是瀏覽器中運行。 但你有沒有想過,我們寫下的 JS 程式碼,這些看似單純的英文和符號,是如何被轉化為機器能夠理解和執行的程式呢? 今天,讓我們一起深入了解其中的核心主角 ——Google 開發的開源 Java
Thumbnail
如果你曾經撰寫過網頁,那你一定接觸過 JavaScript 無論是在 NodeJs 或是瀏覽器中運行。 但你有沒有想過,我們寫下的 JS 程式碼,這些看似單純的英文和符號,是如何被轉化為機器能夠理解和執行的程式呢? 今天,讓我們一起深入了解其中的核心主角 ——Google 開發的開源 Java
Thumbnail
JSON 全名 JavaScript Object Notation,其格式基本上就是key: value的組成如下: { "name": "Bob", "age": 40, "childs": [ { "name": "Justin", "
Thumbnail
JSON 全名 JavaScript Object Notation,其格式基本上就是key: value的組成如下: { "name": "Bob", "age": 40, "childs": [ { "name": "Justin", "
Thumbnail
JavaScript 中的 ESM(ES Modules)和 CJS(CommonJS)是用於模塊化開發的兩種不同的模組系統。 關於CJS CJS 是 CommonJS 的模塊系統,最初是為了在伺服器端使用的 Node.js 開發而設計的,但也被廣泛用於前端開發。CJS 使用 require 函數來
Thumbnail
JavaScript 中的 ESM(ES Modules)和 CJS(CommonJS)是用於模塊化開發的兩種不同的模組系統。 關於CJS CJS 是 CommonJS 的模塊系統,最初是為了在伺服器端使用的 Node.js 開發而設計的,但也被廣泛用於前端開發。CJS 使用 require 函數來
Thumbnail
自己在剛開始進入前端領域時,很剛好遇上需要使用 TypeScript 的案子,一開始都是跟著前輩怎麼寫就怎麼寫,不太有其他餘力來思考「為什麼」會需要寫這門程式語言,直到自己後來使用了 TypeScript 完整開發了電商的購物流程,才慢慢理解到使用 TypeScript 的好處與優勢。
Thumbnail
自己在剛開始進入前端領域時,很剛好遇上需要使用 TypeScript 的案子,一開始都是跟著前輩怎麼寫就怎麼寫,不太有其他餘力來思考「為什麼」會需要寫這門程式語言,直到自己後來使用了 TypeScript 完整開發了電商的購物流程,才慢慢理解到使用 TypeScript 的好處與優勢。
Thumbnail
在初學程式的時候,我曾經看室友開發專案到一半時,突然坐在那發呆,於是我好奇一問,室友說:「我在等程式編譯完成啊。」 還記得當初還是程式小菜雞的我,懞懂無知的說:「編譯?哈哈哈,我們 JavaScript 都不需要編譯耶,可以直接跑在瀏覽器上。」 室友一臉莫名其妙地回我:「噢,是嗎⋯⋯」
Thumbnail
在初學程式的時候,我曾經看室友開發專案到一半時,突然坐在那發呆,於是我好奇一問,室友說:「我在等程式編譯完成啊。」 還記得當初還是程式小菜雞的我,懞懂無知的說:「編譯?哈哈哈,我們 JavaScript 都不需要編譯耶,可以直接跑在瀏覽器上。」 室友一臉莫名其妙地回我:「噢,是嗎⋯⋯」
Thumbnail
許多初學網頁開發的朋友們,一開始都不太理解HTML、CSS、 JavaScript之間的差異性,導致初期規劃學習計畫時毫無頭緒。 會有這樣的困擾,主要在於不了解HTML、CSS、 JavaScript之間的關係,以及這三者在網頁運作時所扮演什麼角色,導致越學越阿雜的狀況。
Thumbnail
許多初學網頁開發的朋友們,一開始都不太理解HTML、CSS、 JavaScript之間的差異性,導致初期規劃學習計畫時毫無頭緒。 會有這樣的困擾,主要在於不了解HTML、CSS、 JavaScript之間的關係,以及這三者在網頁運作時所扮演什麼角色,導致越學越阿雜的狀況。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News