摘要:對象有狀態(tài)對象具有狀態(tài),同一對象可能處于不同狀態(tài)之下。中對象獨有的特色對象具有高度的動態(tài)性,這是因為賦予了使用者在運行時為對象添改狀態(tài)和行為的能力。小結(jié)由于的對象設(shè)計跟目前主流基于類的面向?qū)ο蟛町惙浅4螅瑢?dǎo)致有不是面向?qū)ο筮@樣的說法。
筆記說明
重學(xué)前端是程劭非(winter)【前手機淘寶前端負(fù)責(zé)人】在極客時間開的一個專欄,每天10分鐘,重構(gòu)你的前端知識體系,筆者主要整理學(xué)習(xí)過程的一些要點筆記以及感悟,完整的可以加入winter的專欄學(xué)習(xí)【原文有winter的語音】,如有侵權(quán)請聯(lián)系我,郵箱:[email protected]。1、學(xué)習(xí)JavaScript面向?qū)ο髸r是否有這樣的疑惑?
為什么 JavaScript(直到 ES6)有對象的概念,但是卻沒有像其他的語言那樣,有類的概念呢?
為什么在 JavaScript 對象里可以自由添加屬性,而其他的語言卻不能呢?
2、什么是面向?qū)ο螅?/b> 2.1、JavaScript 對象的特征 2.1.1、對象的特征(來自《面向?qū)ο蠓治雠c設(shè)計》一書)對象具有唯一標(biāo)識性:即使完全相同的兩個對象,也并非同一個對象。
對象有狀態(tài):對象具有狀態(tài),同一對象可能處于不同狀態(tài)之下。
對象具有行為:即對象的狀態(tài),可能因為它的行為產(chǎn)生變遷。
關(guān)于第一點:
var a1 = { a: 1 }; var a2 = { a: 1 }; console.log(a1 == a2); // false
關(guān)于第二、三點:
c++中稱"狀態(tài)和行為"為成員變量和成員函數(shù)
java中則稱它們?yōu)?b>屬性和方法
javaScript中將狀態(tài)和行為統(tǒng)一抽象為屬性
winter舉了個例子,代碼如下:
var o = { d: 1, f() { console.log(this.d); } };
上面代碼中,o是對象,d是一個屬性,而函數(shù)f也是一個屬性,只是寫法不一樣,總結(jié)來說,在JavaScript中,對象的狀態(tài)和行為其實都被抽象為了屬性。
2.1.2、JavaScript 中對象獨有的特色對象具有高度的動態(tài)性,這是因為 JavaScript 賦予了使用者在運行時為對象添改狀態(tài)和行為的能力。
舉例說明運行時如何向一個對象添加屬性:
var o = { a: 1 }; o.b = 2; console.log(o.a, o.b); //1 2
為了提高抽象能力,JavaScript的屬性被設(shè)計成比別的語言更加復(fù)雜的形式,它提供了數(shù)據(jù)屬性和訪問器屬性(getter/setter)兩類。
2.2、JavaScript 對象的兩類屬性 2.2.1、數(shù)據(jù)屬性4個特征:
value:就是屬性的值.
writable:決定屬性能否被賦值.
enumerable:決定 for in 能否枚舉該屬性.
configurable:決定該屬性能否被刪除或者改變特征值.
2.2.2、訪問器(getter/setter)屬性2.2.2.1、4個特征:
getter:函數(shù)或 undefined,在取屬性值時被調(diào)用.
setter:函數(shù)或 undefined,在設(shè)置屬性值時被調(diào)用.
enumerable:決定 for in 能否枚舉該屬性.
configurable:決定該屬性能否被刪除或者改變特征值.
2.2.2.2、Object.getOwnPropertyDescripter 和 Object?.define?Property()
var o, d; o = { get foo() { return 17; } }; d = Object.getOwnPropertyDescriptor(o, "foo"); // d { // configurable: true, // enumerable: true, // get: /*the getter function*/, // set: undefined // } o = { bar: 42 }; d = Object.getOwnPropertyDescriptor(o, "bar"); // d { // configurable: true, // enumerable: true, // value: 42, // writable: true // } o = {}; Object.defineProperty(o, "baz", { value: 8675309, writable: false, enumerable: false }); d = Object.getOwnPropertyDescriptor(o, "baz"); // d { // value: 8675309, // writable: false, // enumerable: false, // configurable: false // }
實際上 JavaScript 對象的運行時是一個“屬性的集合”,屬性以字符串或者 Symbol 為 key,以數(shù)據(jù)屬性特征值或者訪問器屬性特征值為 value。
2.3、小結(jié)由于 JavaScript 的對象設(shè)計跟目前主流基于類的面向?qū)ο蟛町惙浅4?,?dǎo)致有“JavaScript 不是面向?qū)ο蟆边@樣的說法。
JavaScript 語言標(biāo)準(zhǔn)也已經(jīng)明確說明,JavaScript 是一門面向?qū)ο蟮恼Z言,跟JavaScript 的高度動態(tài)性的對象系統(tǒng)密不可分。
個人總結(jié)看完winter的這篇文章深感自己的基礎(chǔ)之薄弱,越模糊的東西越要清楚其本質(zhì),才能保持對事物的正確判斷。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/114571.html
摘要:對象有狀態(tài)對象具有狀態(tài),同一對象可能處于不同狀態(tài)之下。中對象獨有的特色對象具有高度的動態(tài)性,這是因為賦予了使用者在運行時為對象添改狀態(tài)和行為的能力。小結(jié)由于的對象設(shè)計跟目前主流基于類的面向?qū)ο蟛町惙浅4螅瑢?dǎo)致有不是面向?qū)ο筮@樣的說法。 筆記說明 重學(xué)前端是程劭非(winter)【前手機淘寶前端負(fù)責(zé)人】在極客時間開的一個專欄,每天10分鐘,重構(gòu)你的前端知識體系,筆者主要整理學(xué)習(xí)過程的一些...
摘要:對象有狀態(tài)對象具有狀態(tài),同一對象可能處于不同狀態(tài)之下。中對象獨有的特色對象具有高度的動態(tài)性,這是因為賦予了使用者在運行時為對象添改狀態(tài)和行為的能力。小結(jié)由于的對象設(shè)計跟目前主流基于類的面向?qū)ο蟛町惙浅4螅瑢?dǎo)致有不是面向?qū)ο筮@樣的說法。 筆記說明 重學(xué)前端是程劭非(winter)【前手機淘寶前端負(fù)責(zé)人】在極客時間開的一個專欄,每天10分鐘,重構(gòu)你的前端知識體系,筆者主要整理學(xué)習(xí)過程的一些...
摘要:用構(gòu)造器模擬類的兩種方法在構(gòu)造器中修改,給添加屬性修改構(gòu)造器的屬性指向的對象,它是從這個構(gòu)造器構(gòu)造出來的所有對象的原型。 筆記說明 重學(xué)前端是程劭非(winter)【前手機淘寶前端負(fù)責(zé)人】在極客時間開的一個專欄,每天10分鐘,重構(gòu)你的前端知識體系,筆者主要整理學(xué)習(xí)過程的一些要點筆記以及感悟,完整的可以加入winter的專欄學(xué)習(xí)【原文有winter的語音】,如有侵權(quán)請聯(lián)系我,郵箱:kai...
閱讀 2334·2021-11-24 09:39
閱讀 2566·2021-11-22 15:24
閱讀 3008·2021-09-02 09:48
閱讀 3058·2021-07-26 22:01
閱讀 1463·2019-08-30 11:09
閱讀 1707·2019-08-29 18:47
閱讀 635·2019-08-29 15:40
閱讀 2158·2019-08-29 15:22