《JavaScript高級程序設計》讀書筆記

面向對象的程序設計

面向對象的語言都有一個標誌,那就是它們都有類的概念,但ECMAScript中沒有類的概念,ECMA-262中把對象定義爲:“無序屬性的集合,其屬性可以包含基本值、對象或者函數”。
每個對象都是基於引用類型創建的,引用類型可以是原生類型,也可以是開發者定義的類型。

理解對象

最簡單的創建自定義對象的方法(創建一個object實例),然後再爲它添加屬性和方法。

	var person = new Object();
	person.name = "Nicholas";
	person.age = 29;
	person.job = Softeware Engineer";

	person.sayName = function (){
		alert(this.name);
	}

上面例子,通過對象字面量的寫法:

var person = {
	name:"Nicholas",
	age:29,
	job:Software Engineer,

	sayName:function(){
		alert(this.name);
	}
}

屬性類型

ECMAScript中有兩種屬性:數據屬性和訪問器屬性。

1.數據屬性

數據屬性可以通過Object.defineProperty()方法修改屬性的默認特性。

var person = {};
Object.defineProperty(person,"name",{
	writable:false,
	value:"Nicholas"
});

2.訪問屬性

包含一對getter和setter函數也需要Object.defineProperty()來定義。

定義多個屬性

通過Object.defineProperties()方法定義多個屬性。

	var book = {};
	Object.defineProperties(book,{
		_year:{
			value:2004
		},
		edition:{
			value:1
		},
		year:{
		 	get:function(){
				return this._year;
			},
			set:function(newValue){
				if(newValue > 2004){
					this._year = newValue;
					this.edition += newValue - 2004;
				}
			}
		}
	});

讀取屬性的特性

通過Object.getOwnPropertyDescriptor()方法,可以取得給定屬性的描述符。
這個方法可以接收兩個參數:屬性所在的對象和要讀取其描述符的屬性名稱。
返回值是一個對象,如果是訪問器屬性,這個對象的屬性有configurable、enumerable、get和set;如果是數據屬性,這個對象的屬性有configurable、enumerable、writable和value。

	var book = {};
	Object.defineProperties(book,{
		_year:{
			value:2004
		},
		edition:{
			value:1
		},
		year:{
		 	get:function(){
				return this._year;
			},
			set:function(newValue){
				if(newValue > 2004){
					this._year = newValue;
					this.edition += newValue - 2004;
				}
			}
		}
	});
	var descriptor = Object.getOwnPerpertyDescriptor(book,"_year");
	descriptor.value      //2004
	descriptor.configurable     //false
	typeof descriptor.get 	    //"undefined"
	
	var descriptor2 = Object.getOwnPerpertyDescriptor(book,"year");
	descriptor2.value   //undefined
	descriptor2.enumerable     //false
	typeof descriptor.get 	   //"function"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章