一、 JavaScript 對象定義
1、在 JavaScript 中,幾乎“所有事物”都是對象榨惠。
布爾是對象(如果用?new?關鍵詞定義)
數字是對象(如果用?new?關鍵詞定義)
字符串是對象(如果用?new?關鍵詞定義)
日期永遠都是對象
算術永遠都是對象
正則表達式永遠都是對象
數組永遠都是對象
函數永遠都是對象
對象永遠都是對象
所有 JavaScript 值,除了原始值盛霎,都是對象赠橙。
2、原始值和原始數據
原始值指的是沒有屬性或方法的值摩渺。
原始數據類型指的是擁有原始值的數據简烤。JavaScript 定義了 5 種原始數據類型:string剂邮、number摇幻、boolean、null挥萌、undefined
原始值是一成不變的(它們是硬編碼的绰姻,因此不能改變)。假設 x = 3.14引瀑,能夠改變 x 的值狂芋,但是無法改變 3.14 的值。
3憨栽、對象是包含變量的變量
JavaScript 變量能夠包含單個的值帜矾,但是對象能夠包含很多值。值按照名稱 : 值對的形式編寫(名稱和值以冒號分隔)屑柔。
如:var person = {firstName:"Bill", lastName:"Gates", age:62, eyeColor:"blue"};
JavaScript 對象是命名值的集合屡萤。
二、 JavaScript 對象屬性
JavaScript 對象是命名值的集合掸宛。JavaScript 對象中的命名值死陆,被稱為屬性。無序屬性唧瘾。屬性通炒胍耄可以被修改别凤、添加和刪除,但是某些屬性是只讀的领虹。
1规哪、訪問 JavaScript 屬性
訪問對象屬性的語法是:objectName.property? ? ? ? ? ? ?// person.age
或者:objectName["property"]? ? ? ? ? // person["age"]
或者:objectName[expression]? ? ? ? ?// x = "age"; person[x]
表達式必須計算為屬性名。
2塌衰、for...in 循環(huán)遍歷對象屬性
for (variableinobject) {要執(zhí)行的代碼}? ??
for...in?循環(huán)中的代碼塊會為每個屬性執(zhí)行一次由缆。
3、添加屬性
通過簡單的賦值向已存在的對象添加新屬性猾蒂。
person.nationality = "English";
4均唉、刪除屬性
delete?關鍵詞從對象中刪除屬性。delete person.age;
delete?關鍵詞會同時刪除屬性的值和屬性本身肚菠。刪除完成后舔箭,屬性在被添加回來之前是無法使用的。
delete?操作符被設計用于對象屬性蚊逢。它對變量或函數沒有影響层扶。
delete?操作符不應被用于預定義的 JavaScript 對象屬性,這樣做會使應用程序崩潰烙荷。
5镜会、屬性值
所有屬性都有名稱和值。
屬性的特性:值终抽、可列舉戳表、可配置、可寫昼伴。這些特性定義了屬性被訪問的方式(是可讀還是可寫)
在 JavaScript 中匾旭,所有屬性都是可讀的,但是只有值是可修改的(只有當屬性為可寫時)圃郊。
6价涝、原型屬性
JavaScript 對象繼承了它們的原型的屬性。
delete?關鍵詞不會刪除被繼承的屬性持舆,但是如果刪除了某個原型屬性色瘩,則將影響到所有從原型繼承的對象。
三逸寓、 JavaScript 對象方法
方法是可以在對象上執(zhí)行的動作居兆。對象屬性可以是原始值、其他對象以及函數席覆。對象方法是包含函數定義的對象屬性(即存儲為對象屬性的函數)史辙。
1、this?關鍵詞
在 JavaScript 中,被稱為?this?的事物聊倔,指的是擁有該 JavaScript 代碼的對象晦毙。
this?的值,在函數中使用時耙蔑,是“擁有”該函數的對象见妒。請注意?this?并非變量。它是關鍵詞甸陌。無法改變?this?的值须揣。
fullName : function() {? return this.firstName + " " + this.lastName;}
2、創(chuàng)建對象方法:
methodName: function() {代碼行}
3钱豁、訪問對象方法:
objectName.methodName()
屬性在被通過 () 調用后會以函數形式執(zhí)行耻卡。
4、使用對象的內建方法
var message = "Hello world!";
var x = message.toUpperCase();
5牲尺、添加新的方法
向對象添加方法是在構造器函數內部完成的
四卵酪、 JavaScript 對象訪問器
Getter 和 Setter 允許定義對象訪問器(被計算的屬性)。
1谤碳、JavaScript Getter(get 關鍵詞)
2溃卡、JavaScript Setter(set 關鍵詞)
3、JavaScript 函數和 Getter的區(qū)別
函數以函數形式訪問 fullName:person.fullName()蜒简。
get關鍵詞以屬性形式訪問 fullName:person.fullName瘸羡。
Getter 和 Setter提供了更簡潔的語法,允許屬性和方法的語法相同搓茬,可以確保更好的數據質量犹赖,有利于后臺工作。
4垮兑、數據質量
使用 getter 和 setter 時冷尉,JavaScript 可以確保更好的數據質量漱挎。
五系枪、 JavaScript 對象構造器
1、對象類型(藍圖)(類)
有時需要創(chuàng)建相同“類型”的許多對象的“藍圖”磕谅。創(chuàng)建一種“對象類型”的方法私爷,是使用對象構造器函數。
通過?new?關鍵詞調用構造器函數可以創(chuàng)建相同類型的對象:var myFather = new Person("Bill", "Gates", 62, "blue");
2衬浑、this?關鍵詞
this?的值,在對象中使用時放刨,就是對象本身工秩。在構造器函數中,this?是沒有值的。它是新對象的替代物助币。 當一個新對象被創(chuàng)建時浪听,this 的值會成為這個新對象。
3眉菱、添加對象屬性
myFather.nationality = "English";
4迹栓、添加對象方法
myFather.name = function () {? return this.firstName + " " + this.lastName;? };
5、為構造器添加屬性
無法直接為對象構造器添加新屬性俭缓,必須添加到構造器函數內部克伊,這樣對象屬性就可以擁有默認值。
6华坦、為構造器添加方法
無法直接為對象構造器添加新方法愿吹,必須添加到構造器函數內部。
7惜姐、內建 JavaScript 構造器
JavaScript 提供用于原始對象的構造器洗搂。
var x1 = new Object();// 一個新的 Object 對象。使用對象字面量?{}?代替
var x2 = new String();// 一個新的 String 對象载弄。使用字符串字面量?""?代替
var x3 = new Number();// 一個新的 Number 對象耘拇。使用數值字面量代替
var x4 = new Boolean();// 一個新的 Boolean 對象。使用布爾字面量代替
var x5 = new Array();// 一個新的 Array 對象宇攻。使用數組字面量?[]代替
var x6 = new RegExp();// 一個新的 RegExp 對象惫叛。使用模式字面量代替
var x7 = new Function();// 一個新的 Function 對象。使用函數表達式?() {}?代替
var x8 = new Date();// 一個新的 Date 對象
Math()?對象不再此列逞刷。Math 是全局對象嘉涌。new?關鍵詞不可用于 Math。
六夸浅、 JavaScript 對象原型
所有 JavaScript 對象都從原型繼承屬性和方法仑最。
日期對象繼承自 Date.prototype。數組對象繼承自 Array.prototype帆喇。Person 對象繼承自 Person.prototype……
Object.prototype 位于原型繼承鏈的頂端:日期對象警医、數組對象和 Person 對象都繼承自 Object.prototype。
1坯钦、向對象添加屬性和方法
向所有給定類型的已有對象添加新屬性(或方法)预皇。
向對象構造器添加新屬性(或方法)。
①使用?prototype?屬性
JavaScript prototype 屬性允許為對象構造器添加新屬性:
JavaScript prototype 屬性也允您為對象構造器添加新方法:
注意:請只修改自己的原型婉刀。絕不要修改標準 JavaScript 對象的原型吟温。
七、 JavaScript ES5 對象方法
1突颊、ES5 新的對象方法
Object.defineProperty(object, property, descriptor)鲁豪;// 添加或更改對象屬性
Object.defineProperties(object, descriptors)潘悼;// 添加或更改多個對象屬性
Object.getOwnPropertyDescriptor(object, property);// 訪問屬性
Object.getOwnPropertyNames(object)爬橡;// 以數組返回所有屬性
Object.keys(object)挥等;// 以數組返回所有可枚舉的屬性
Object.getPrototypeOf(object);// 訪問原型
Object.preventExtensions(object)堤尾;// 阻止向對象添加屬性
Object.isExtensible(object)肝劲;// 如果可將屬性添加到對象,則返回 true
Object.seal(object)郭宝;// 防止更改對象屬性(而不是值)
Object.isSealed(object)辞槐;// 如果對象被密封,則返回 true
Object.freeze(object)粘室;// 防止對對象進行任何更改
Object.isFrozen(object)榄檬;// 如果對象被凍結,則返回 true
2衔统、更改元數據
ES5 允許更改以下屬性元數據:
writable : true// 屬性值可修改
enumerable : true// 屬性可枚舉
configurable : true// 屬性可重新配置
writable : false// 屬性值不可修改
enumerable : false// 屬性不可枚舉
configurable : false// 屬性不可重新配置
? ? ? Object.defineProperty(person, "language", {writable:false}); //使語言為只讀
3鹿榜、ES5 允許更改 getter 和 setter:
get: function() { return language } // 定義 getter
set: function(value) { language = value }?// 定義 setter