了解對象
個人了解:對象是由屬性和方法組成。
var student = {
name : 'lisi',
age : 18,
call : function(){
console.log("我叫"+this.name);
}
}
在student中有name,age這兩個屬性,及call這個方法。
在js中屬性也分為兩種:資料屬性和通路器屬性
資料屬性
資料屬性有以下四個特點:
Configurable:該屬性能否使用delete删除,能否修改屬性的特性,如把它修改為通路器屬性。像上面的例子,預設是true
Enumerable:能否使用for-in循環傳回屬性。像上面的例子,預設是true
Writable:能否修改屬性的值。像上面的例子,預設是true
Value:儲存屬性的值。像上面的例子,值是lisi,18
有些時候我們不想某個屬性被修改或者被删除,那麼我們可以使用defineProperty這個方法來修上述的預設值。這個方法有三個參數:對象,屬性的名字,對象描述符
console.log(delete(student.name))//傳回true
Object.defineProperty(student,'name',{
configurable : false, //該屬性不能被删除
writable: false, //屬性值不能修改
value: "lisi"
})
console.log(delete(student.name)) //傳回false
student.name = 'san';
console.log(student.name) // 傳回lisi,值并沒有被修改
注意:一旦把屬性定義為不可配置,那麼就不能修改回來
Object.defineProperty(student,'name',{
configurable : false,
})
console.log(delete(student.name))
Object.defineProperty(student,'name',{
configurable : true,
})
console.log(delete(student.name)) 報錯
demo.html:17Uncaught TypeError: Cannot redefine property: name at Function.defineProperty(<anonymous>)at demo.html:17
通路器屬性
通路器屬性有以下四個特點:
Configurable:該屬性能否使用delete删除,能否修改屬性的特性,如把它修改為通路器屬性。像上面的例子,預設是true
Enumerable:能否使用for-in循環傳回屬性。像上面的例子,預設是true
Get:在讀取屬性時調用的函數。預設值為undefined。
Set:在寫入屬性時調用的函數。預設值為undefined。
var student = {
_name : 'lisi',
age : 18,
call : function(){
console.log("我叫"+this.name);
}
}
Object.defineProperty(student,'name',{
get : function(){
return this._name;
},
set : function(newName){
if(newName == 'san')
this.age = 20;
}
})
student.name = 'san';
console.log(student.age) //20
_name加上下劃線表示用于隻能用對象方法通路的屬性