物件字面量建立物件:
var person =
}
1.屬性型別
為表示特性是內部值,js不能直接訪問它們,把它們放在兩對方括號中,例如[[enumerable]]
ecmascript有兩種屬性:資料屬性,訪問器屬性
資料屬性
包含乙個資料值的位置,可以讀取和寫入值,,有四個屬性描述其行為:
訪問器屬性
訪問器屬性不包含資料值,只含一對getter和setter函式;
在讀取訪問器屬性時,會呼叫getter函式,負責返回有效的值,在寫入訪問器屬性時,會呼叫setter函式並傳入新值,
訪問器屬性有四個特性
var book =
object.defineproperty(book,"year",,
set: function
(newvalue)
}})
book物件定義了兩個預設的屬性,_year和edition,_year 前面的下劃線是一種常用的記號,用於表示只能通過物件方法訪問的屬性,訪問器屬性year包含乙個getter函式和setter函式,一般訪問器屬性的值這樣使用:改變乙個屬性值會導致其他屬性發生變化
嚴格模式下必須getter和setter同時指定
定義多個屬性
object.defineproperties()方法,可以通過描述符一次定義多個屬性,這個方法接收兩個物件引數:第乙個為要新增和修改其屬性的物件,第二個物件與第乙個物件中要新增或修改的屬性一一對應
讀取屬性的特性
object.getownpropertydescriptor()方法,可以取得給定屬性的描述符;
接受兩個引數:屬性輸在物件,要讀取其描述符的屬性名稱,返回值是乙個物件,如果是訪問器屬性,這個物件的屬性有configurable,enumerable,get和set,如果是資料屬性,這個隊形的屬性有configurable,enumerable,writable和value;其中value初始值為undefined,get
set為undefined,其餘為false
用建構函式或物件字面量可以用來建立單個物件,但是有明顯缺點,會產生大量的重複**,為解決這個問題
工廠模式
function
ceateperson
(name,age,job)
return o;
}var person = createperson('nickho',29,'sdfsdfdsf')
解決了重複**的問題,但是沒有解決物件的識別問題(即知道乙個物件的型別)
建構函式模式
建構函式應以乙個大寫字母開頭,非建構函式以小寫字母開頭
function
person
(name,age,job)
}var person1 = new person('nickho',29,'sdfsdfdsf')
new呼叫建構函式會經歷一下4個步驟
將建構函式當做函式
任何函式,只要能通過new來呼叫,就可以把它作為建構函式;沒通過new來呼叫,就是普通函式;如person(『nickho』,29,』sdfsdfdsf』)//就是當做普通函式呼叫的,新增到window
var o = new
object();
person.call(o,"kristen",25,"nurse")
o.sayname()//在o的作用域呼叫,呼叫後o具有所有的屬性和sayname方法
構造器函式缺點::每個方法都要在每個例項上重新建立一遍
可以把函式定義轉移到建構函式外部來解決這個問題。但是會出現新的問題,全域性函式只能被某個函式呼叫,如果有很多方法就要定義很多全域性函式,,沒有封裝性可言,那就引出了原型模式
原型模式
每個函式都有乙個prototype(原型)屬性,這個屬性是乙個指標,指向乙個物件,而這個物件的用於是包含可以由特定型別的所有例項共享的屬性和方法;可以讓所有物件例項共享它所包含的屬性和方法;不用再建構函式中定義物件例項的資訊,而是將這些資訊直接新增到原型物件中
function
person
(){}
person.prototype.name = 'nicholas';
person.prototype.sayname = function
(){}
var person1 = new person();
var person2 = new person();
person1.sayname == person2.sayname;//true;
hasownproperty 方法可以檢測乙個屬性是存在於例項中還是原型中,只有在屬性存在於例項中時,才會返回true;
原型與in操作符
in兩種使用方法:單獨使用和for-in迴圈中使用。單獨使用時,in會在通過物件能訪問給定屬性時返回true,無論在例項中還是在原型中(可以和hasownproperty結合使用,確定屬性在物件還是原型);
function hasprototypeproperty(object,name)
for-in 迴圈時,返回的是能所有能通過物件訪問的、可列舉(enumerated)屬性,其中既包括例項中的屬性,也包括存在於原型中的屬性
取得物件上所有可列舉的例項屬性,object.keys()方法會就接收乙個物件作為引數,返回乙個包含所有可列舉屬性的字串數值(例如person.prototype或者person1)
獲取所有的例項屬性,無論是否可列舉object.getownpropertynames(person.prototype)//["constructor", "name", "sayname"]
原型的動態性
由於在原型查詢值的過程是一次搜尋,因此我們對原型物件所做的任何修改都能立即從例項上反映出來,即使先建立了例項後修改原型也是如此;
function
person
(){}
var fri = new person();
person.prototype.sayname = fucntion()
friend.sayname();//ok
person.prototype =
}friend.sayname();//error
但是如果重寫了整個原型物件,情況就不一樣了,建構函式會為例項新增乙個指向最初原型的指標,而把原型修改為另乙個物件就等於切斷了建構函式和最初原型之間的聯絡,例項中的指標僅僅指向原型,不是指向建構函式
但是原型模式也會有乙個問題,如果屬性是基本型別的話,可以通過在例項中新增 乙個同名屬性,但是如果是引用型別的話,就會造成所有的例項都包含同乙個引用型別,因此很少單獨使用原型模式
第六章總結
6.1 使用滑鼠 6.1.1 滑鼠時間和滑鼠訊息 根據使用者操作滑鼠時滑鼠的位置,滑鼠訊息分為兩類 客戶區滑鼠訊息和非客戶區滑鼠訊息。1.客戶去滑鼠訊息 2.當滑鼠游標位於視窗的使用者區時,將生成客戶滑鼠訊息。滑鼠訊息和鍵盤訊息有所不同,windows 只將鍵盤有訊息傳送給具有輸入極點的視窗,但滑鼠...
第六章總結
為了解決連續計算的問題需求,而產生了迴圈控制結構。若重複次數已知,則為技術控制,若次數未知,結構為條件控制則為條件控制結構。迴圈結構分兩種結構,三種語句。一 當型迴圈,先判斷,再執行。while語句,滿足條件即執行迴圈。for語句。for語句為一種特殊的當型迴圈,也是最常用的迴圈結構。其結構為 初始...
第六章總結
一 迴圈控制結構 1 學過 for 迴圈 怎麼用 for 初始化表示式 迴圈控制表示式 增值表示式 初始化表示式 for 迴圈控制表示式 增值表示式 初始化表示式 for 迴圈控制表示式 感悟 for迴圈多用於計數控制的迴圈 如果知道迴圈次數,多用for迴圈 for語句中間的迴圈表示式,可以與迴圈變...