重學前端是程劭非(winter)【前手機淘寶前端負責人】在極客時間開的一個專欄, 天天10分鐘,重構你的前端知識體系,筆者主要整理學習過程的一些要點筆記以及感悟,完整的能夠加入winter的專欄學習【原文有winter的語音】,若有侵權請聯繫我,郵箱:kaimo313@foxmail.com。
關於第一點:前端
var a1 = { a: 1 }; var a2 = { a: 1 }; console.log(a1 == a2); // false
關於第2、三點:java
c++
中稱"狀態和行爲"爲成員變量
和成員函數
java
中則稱它們爲屬性
和方法
javaScript
中將狀態和行爲統一抽象爲屬性
winter舉了個例子,代碼以下:c++
var o = { d: 1, f() { console.log(this.d); } };
上面代碼中,o是對象,d是一個屬性,而函數f也是一個屬性,只是寫法不同,總結來講,在JavaScript中,對象的狀態和行爲其實都被抽象爲了屬性。函數
對象具備高度的動態性,這是由於 JavaScript 賦予了使用者在運行時爲對象添改狀態和行爲的能力。
舉例說明運行時如何向一個對象添加屬性:性能
var o = { a: 1 }; o.b = 2; console.log(o.a, o.b); //1 2
爲了提升抽象能力,JavaScript的屬性被設計成比別的語言更加複雜的形式,它提供了數據屬性和訪問器屬性(getter/setter)兩類。學習
4個特徵:this
value
:就是屬性的值.writable
:決定屬性可否被賦值.enumerable
:決定 for in 可否枚舉該屬性.configurable
:決定該屬性可否被刪除或者改變特徵值.2.2.2.一、4個特徵:設計
getter
:函數或 undefined,在取屬性值時被調用.setter
:函數或 undefined,在設置屬性值時被調用.enumerable
:決定 for in 可否枚舉該屬性.configurable
:決定該屬性可否被刪除或者改變特徵值.2.2.2.二、Object.getOwnPropertyDescripter 和 Object.defineProperty()code
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,以數據屬性特徵值或者訪問器屬性特徵值爲 value。對象
看完winter的這篇文章深感本身的基礎之薄弱,越模糊的東西越要清楚其本質,才能保持對事物的正確判斷。