JavaScript對象,你好

 

1、對象的定義

1. JavaScript數據類型

就分兩種:原始值和對象。除了字符串、數字、true、false、null和undefined這幾個原始值以外都是對象。原始值是不能修改的,而對象是能夠修改的。javascript

2. 宏觀上分爲三種對象

1)內置對象:由js ES標準給定的對象和類:數組、函數、日期和正則表達式java

2)宿主對象:有js解析器(瀏覽器)給定的,如HTMelement對象、Windows對象等等。web

3)自定義對象:開發者自定義的對象。正則表達式

2、對象(屬性)的增刪改查

1. 增長對象的三種方法

1) 直接量:注意有些特殊字符或者保留字要用雙引號來表示屬性的名。直接量會比較麻煩的一點就是,每次直接實例化,當實例化不少的時候就重複性工做就多!數組

2)關鍵字new:new後面跟着函數調用,這裏的函數稱做構造函數。原始類型對象都包含了內置構造函數瀏覽器

3)object.create():ide

create種傳入對象原型(類)函數

4)工廠方法:this

(原則上構建也就是123三種方法而已,工廠方法只是巧妙借用第2)種方法)工廠函數只是用一個普通的函數(不一樣於構造函數函數名必須是首個字母大寫,工廠方法函數通常是小寫)來封裝構建一個對象的過程。spa

function createPerson(name,age,say){ 
 var obj = new Object();
 obj.name = name;
 obj.age = age;
 obj.say = say;
 obj.should = function(){ 
		alert(this.say);
 } 
 return obj;
 } 
 var person1 = createPerson('zhangsan',18,'hello world');
 var person2 = createPerson('lisi',15,'你好');

 

2. 刪除屬性

delete運算符只能刪除自有屬性,不能刪除繼承屬性(要刪除繼承屬性必須從定義這個屬性的原型對象上刪除),但這個會影響全部繼承這個原型的對象!

3. 修改

1)對於數據屬性能夠直接用.運算和[]進行直接修改

2)修改屬性特性:object.definePeoperty()

3)修改對象的可擴展性(鎖定對象)

4)屬性賦值時首先先檢查原型鏈,若是該屬性是繼承父類屬性且父類設置爲只讀的,子類如今的這個賦值時不容許的!而若是可寫,就會覆蓋(override),可是不會影響父類的這個屬性。若是不是繼承屬性,就會在子類上新建這個屬性並賦值。

4. 查詢

1)最基本的引用對象屬性:點運算和[]引用。當屬性定義時用到了保留字或者特殊字符(定義時須要用雙引號來寫屬性名),就不能用點運算來引用,點運算後必須是標識符(合法的js命名),得用[]運算。

2)遍歷全部(枚舉)屬性:for/in、extend

3)檢測屬性(是否存在):in運算符、hasOwnPreperty()、propertyIsEnumerable()、!==

4)查詢屬性特性:

A. object.getOwnPropertyDescriptor()//只能只能獲取自有屬性的特性;

B. object.getPrototypeOf()//遍歷繼承屬性

5)查詢對象類型:classOf() 

6)查詢屬性(未知是自有屬性仍是繼承屬性)的原型鏈「冒泡」查詢:

要查詢對象o的屬性x,若是o中不存在x,那麼將會繼續在o的原型對象中查詢屬性x,若是原型中也沒有,那繼續找原型的原型,直到找到一個原型爲null的對象爲止。

3、對象三個特性

1. 原型(繼承):原型鏈

0)原型鏈:var mydate  = new Date().//object.prototype是Date.prototype的原型——》Date.prototype是mydate的原型。

1)全部直接量建立的對象都具備同一個原型對象:object.prototype

2)經過new建立的對象的原型就是構造函數的prototype屬性的值。因此它的原型也是object.prototype。如Date對象的原型是Date.prototype它的構造函數是Date()。

3)只有在查詢屬性的時候纔會體會到繼承的存在,而設置屬性則與繼承無關即修改最上面的對象時不會影響到原型相同的屬性,以防在不知情的狀況下篡改了父類的屬性,給「他人」帶來影響。因此不會修改原型鏈。

4)沒有原型的對象有:null、object.prototype

5)全部js對象都從object.prototype繼承屬性,這些繼承屬性主要是方法。因此對象的方法一般是繼承的屬性(因此咱們常常是在對象的原型那添加自定義方法,而後直接在DOM對象上.function()去引用,這就是插件的原理)。

2. 對象的「類型」

表示對象的類型信息

3. 可擴展性

1)可擴展性的目的是將對象「鎖定」,以免被外界干擾。

2)全部內置對象和自定義對象都是可擴展的。

 

4、屬性分類

數據屬性:能夠直接賦值的屬性

存儲屬性:由getter和setter定義的屬性,這兩個表達式返回的值就是該屬性的值。讀取仍是同樣同數據屬性用.運算符和[]進行讀取。一般getter和setter較用於類的封裝,訪問類的私有變量和參數。

5、屬性四個特性

可讀:能否讀取該屬性的值;

可寫:代表是否能夠設置該屬性的值;

可枚舉:一般由js代碼建立的屬性都是可枚舉的,除非特殊改變。可用for/in來遍歷的屬性;

可配置:代表是否能夠刪除和修改改屬性;

6、序列化對象

把對象轉換成JSON。

7、特殊的對象

1. 數組

2. 函數

3.空對象:

對象的最原始DNA:Object.prototype
因此建立空對象:
var obj = new Object()//原型=構造函數.prototype因此它的原型是Object.prototype。
從而可得:===  var obj = Object.creat(Object.prototype);
                 ===  var obj = {};
4. 沒有原型的對象:var obj =  Object.creat(null);

5. 全局對象:當js解析器啓動時,或者web加載一個新頁面時候,它將建立一個新的全局對象。這個全局對象可使用this來引用!var global = this;

8、注意你的對象不要被覆蓋

<script>
       var obj = {
           name:'xiaoming',
           age:25
       };
       console.log('\n obj.name = '+ obj.name);  // xiaoming
       console.log('\n obj.age = '+ obj.age);   // 25
       obj = {
           sex:"male"
       };
       console.log('\n obj.name = '+ obj.name);  //undefined  被覆蓋
       console.log('\n obj.sex = '+ obj.sex);   // male
       console.log('\n obj.age = '+ obj.age);   //undefined   被覆蓋

        obj.hair = 'black';
       console.log('\n obj.sex = '+ obj.sex);   // male    沒有被覆蓋
       console.log('\n obj.hair = '+ obj.hair);   //black
    </script>

9、問題來了

  1. 咱們如何用三種方法來建立沒有原型的對象和空對象?
  2. 如何在遍歷可枚舉的自有屬性規避繼承屬性?
  3. extend函數?
  4. constructor.prototype纔是對象直接量的真正原型?P138  P205
  5. 原型爲null的對象?
  6. 對象的四個特性中,可寫和可配置有何差別?
相關文章
相關標籤/搜索