面向對象的語言有一個標志,即擁有類的概念,抽象實例對象的公共屬性與方法,基于類可以創建任意多個實例對象,一般具有封裝、繼承、多態的特性!但JS中對象與純面向對象語言中的對象是不同的,ECMA標準定義JS中對象:無序屬性的集合,其屬性可以包含基本值、對象或者函數。可以簡單理解為JS的對象是一組無序的值,其中的屬性或方法都有一個名字,根據這個名字可以訪問相映射的值(值可以是基本值/對象/方法)。
一、理解對象:
第一種:基于Object對象
var person = new Object();person.name = 'My Name';person.age = 18;person.getName = function(){  return this.name;}第二種:對象字面量方式(比較清楚的查找對象包含的屬性及方法)
var person = {  name : 'My name',  age : 18,  getName : function(){    return this.name;  }}JS的對象可以使用‘.'操作符動態的擴展其屬性,可以使用'delete'操作符或將屬性值設置為'undefined'來刪除屬性。如下:
person.newAtt='new Attr';//添加屬性alert(person.newAtt);//new Attrdelete person.age;alert(person.age);//undefined(刪除屬性后值為undefined);
二、對象屬性類型
ECMA-262第5版定義了JS對象屬性中特征(用于JS引擎,外部無法直接訪問)。ECMAScript中有兩種屬性:數據屬性和訪問器屬性
1、數據屬性:
數據屬性指包含一個數據值的位置,可在該位置讀取或寫入值,該屬性有4個供述其行為的特性:
[[configurable]]:表示能否使用delete操作符刪除從而重新定義,或能否修改為訪問器屬性。默認為true;
[[Enumberable]]:表示是否可通過for-in循環返回屬性。默認true;
[[Writable]]:表示是否可修改屬性的值。默認true;
[[Value]]:包含該屬性的數據值。讀取/寫入都是該值。默認為undefined;如上面實例對象person中定義了name屬性,其值為'My name',對該值的修改都反正在這個位置
要修改對象屬性的默認特征(默認都為true),可調用Object.defineProperty()方法,它接收三個參數:屬性所在對象,屬性名和一個描述符對象(必須是:configurable、enumberable、writable和value,可設置一個或多個值)。
如下:(瀏覽器支持:IE9+、Firefox 4+、Chrome、Safari5+)
var person = {};Object.defineProperty(person, 'name', {  configurable: false,  writable: false,  value: 'Jack'});alert(person.name);//Jackdelete person.name;person.name = 'lily';alert(person.name);//Jack可以看出,delete及重置person.name的值都沒有生效,這就是因為調用defineProperty函數修改了對象屬性的特征;值得注意的是一旦將configurable設置為false,則無法再使用defineProperty將其修改為true(執行會報錯:can't redefine non-configurable property);
新聞熱點
疑難解答
圖片精選