天天看點

了解對象

   了解對象

個人了解:對象是由屬性和方法組成。

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加上下劃線表示用于隻能用對象方法通路的屬性

繼續閱讀