1、理解對象html
「萬物皆對象」,所謂對象,就是擁有本身的屬性和方法的數據。最簡單的是經過如下兩種方式來定義對象json
<script> //1、開始的模式,經過初實例化一個Object對象,賦給變量person,並在person上添加屬性和方法 // var person = new Object(); // person.name = "jiang"; // person.age = 29; // person.job = "software engineer"; // person.sayName = function(){ // console.log(this.name); // } // person.sayName(); //2、 字面量形式建立對象,說明白點就是json形式的數據 var person={ name: 'jiang2', age: 29, job: 'software engineer', sayName: function(){ console.log(this.name); } } person.sayName(); <script>
2、屬性類型函數
1. 數據屬性含義:包含一個數據值的位置,在這個位置上能夠讀取和寫入值,數據屬性有4個描述行爲的特徵,分別是configurable、enumerable、writable、value。this
configurable:可否經過delete刪除屬性從而從新定義屬性,可否修改屬性的特徵或者修改成訪問其屬性,其默認值爲truespa
enumerable:表示可否經過for-in循環番薯屬性,默認爲truecode
writable: 可否修改屬性的值。默認爲truehtm
value:包含這個屬性的數據值,其餘屬性特性都被設置爲true,而value特性被設置爲指定的值對象
經過代碼來分析屬性:blog
//eg,如下例子的name屬性的value值就是jiang
// var person ={
// name : 'jiang'
// };
var person = {};
Object.defineProperty(person, 'name', {
writable: false,
value: 'jaing'
});//這說明,當name的writable屬性設置爲FALSE,該屬性沒法修改value的值
console.log(person.name);
person.name = 'zhen';
console.log(person.name);
var person2 = {};
Object.defineProperty(person2, 'name', {
configurable: false,
value: 'jiang2'
});
console.log(person2.name);
delete person2.name;
//當configurable爲FALSE。delete沒法刪除name屬性
//對name屬性調用delete在非嚴格模式下不會發生問題,可是在嚴格模式下就會出錯,而且一旦設置了FALSE,
//就不能夠再變回true,此時在調用Object.defineProperty方法修改writable以外的特徵,都會報錯
console.log(person2.name);
//調用Object.defineProperty方法時,前三個特徵的默認值都是FALSE
2. 訪問器屬性:ip
configurable:他們包括getter和setter方法,讀取訪問器屬性時,會調用getter方法,負責返回有效值,寫入時調用setter方法傳入新值,默認值爲true
enumerable:表示可否經過for-in循環返回屬性,默認爲true
get: 讀取屬性時調用,默認值爲undefined
set:寫入屬性時調用,默認值爲undefined
要注意的是:訪問器屬性不能直接定義,必需要經過Object.defineProperty()來定義。
var book = {
_year: 2014,
edition: 1
}
Object.defineProperty(book, 'year', {
get: function(){
return this._year;
},
set: function(newValue){
if(newValue > 2014){
this._year = newValue;
this.edition += newValue - 2014;
}
}
});
book.year = 2015;
console.log(book.edition);
不必定要同時指定getter和setter,只指定getter意味着屬性是不能寫,嘗試寫入屬性會被忽略掉,在嚴格模式下,嘗試寫入只指定getter函數的屬性會拋出錯誤,相似的,只指定setter函數的屬性也不能讀,不然在非嚴格模式下會返回undefined,嚴格模式下就會跑出錯誤
建立訪問器屬性,通常都使用兩個非標準的方法,__defineGetter__ 和 __defineSetter__
var book2 = {
_year : 2014,
edition : 1
};
book2.__defineGetter__('year', function(){
return this._year;
});
book2.__defineSetter__('year', function(newValue){
if(newValue > 2014){
this._year = newValue;
this.edition += newValue - 2014;
}
});
book2.year = 2016;
console.log(book2.edition);