ECMA-262把對象定義爲:無序屬性的集合,其屬性能夠包含基本值、對象或函數。因此,咱們能夠理解對象就是名值對的集合,名就是對象的每一個屬性的名字,而每一個名字都映射到一個值。java
建立對象有兩種方式:
方式一segmentfault
var person=new Object(); person.name=「Jone」; person.age=20; person.job=「Software Engineer」; person.sayName=function(){ alert(this.name); };
方式二函數
var person={ name:」Jone」, age:20, job:「Software Engineer」, sayName:function(){ alert(this.name); } };
這兩種方式建立的對象都是同樣的。也能夠靈活的混合使用,但要記住var person=new Object()
和this
var person={ name:」Jone」, age:20, job:「Software Engineer」, sayName:function(){ alert(this.name); } }
都是在爲person賦值,不可重複賦值,若是重複使用就至關於前面的值放棄,使用後來從新賦的值。或者說都是在給person指向了一個新的地址,地址裏存着新的對象。person肯定是一個引用類型了,就能夠在任意的地方用點來爲它添加屬性和訪問屬性,例如:person.sex=「女」
。person用點訪問時不會再爲person更改指向地址,更改的是地址裏存着的對象。設計
對象的屬性能夠分爲兩種屬性:數據屬性,訪問器屬性。兩種類型的屬性有各自的特性。code
[[configurable]]:表示可否經過delete刪除屬性,可否修改屬性的特性,或者可否把屬性修改成訪問器屬性。 [[enumerable]]:表示可否經過for-in循環返回屬性。 [[writable]]:表示可否修改屬性的值。 [[value]]:包含這個屬性的數據值。讀取屬性值的時候,從這個位置讀取;寫入屬性值的時候,把新值保存在這個位置。這個特性的默認值是undefined。 像上面的例子那樣直接在對象上定義的屬性,它們的configurable、enumerable、writable這些特性默認值爲true。
[[configurable]]:表示可否經過delete刪除屬性,可否修改屬性的特性,或者可否把屬性修改成訪問器屬性。 [[enumerable]]:表示可否經過for-in循環返回屬性。 [[get]]:在讀取屬性時調用的函數。默認值是undefined [[set]]:在寫入屬性時調用的函數。默認值是undefined 像上面的例子那樣直接在對象上定義的屬性,它們的configurable、enumerable這些特性默認值爲true。
訪問器屬性的使用方式即:設置一個屬性的值會致使其餘屬性發生變化。
訪問器屬性的get
、set
特性不能直接定義,而是使用Object.defineProperty()
來定義,屬性的get
、set
特性和writable
、value
特性不能同時存在。對象
例如:繼承
var book={}; Object.defineProperty(book,」year」,{ configurable:true, value:2004 }); Object.defineProperty(person,」_year」,{ configurable:true, get:function(){ return this.year; }, set:function(newValue){ if(newValue>2004){ this.year=newValue; } } });
建立一個新屬性,或修改一個屬性的特性。建立一個新屬性時,若是不指定,configurable
、enumerable
、writable
默認值都爲false
。configurable
一旦被設置爲false
,就不能再把它變回true
了,此時,再調用Object.defineProperty()
修改除writable
以外的特性都會報錯。ip
能夠一次性定義多個屬性。get
var book={}; Object.defineProperties(book,{ year:{ configurable:true, value:2004 }, _year:{ configurable:true, get:function(){ return this.year; }, set:function(newValue){ if(newValue>2004){ this.year=newValue; } } } });
用來讀取屬性的特性。接受兩個參數:屬性所在的對象和要讀取其特性的屬性名,返回的時其特性的對象
例如:
var descriptor=Object.getOwnPropertyDescriptor(book,」year」); alert(descriptor.value);//2004 alert(descriptor.configurable);//true
讀《javaScript高級程序設計》這本書的第6章面向對象的程序設計,我作了3篇筆記。這是第一篇,後面還有兩篇,分別是封裝類和繼承。
之前一直認爲真正理解了一個問題,你就能把它講清楚,講清楚了再把它寫清楚就容易了,如今發現要寫清楚真的太難了,要斟酌每句話都不是廢話,沒有歧義,儘可能用少的字句等等。廢話了很久也不知道寫清楚了嗎。
若是哪裏有問題歡迎指出。