一、創建對象
1、創建空對象
方式一:
var o ={};o; //Object {}
typeof(o); //"object"
方式二:
var o=new Object();o;//Object {}
typeof(o);//"object"
2、創建非空對象
在 javascript 中創建對象有兩種方式:對象文本標記法、構造器函數定義對象;
方式一:對象文本標記法:
先上例子:

1 var hero= { 2 name:'小明', 3 Sex:'男', 4 say: function(){ return this.name+': 您好!';} 5 }; 6 hero.name; //"小明" 7 hero.Sex; //男" 8 hero.say(); //"小明: 您好!" 9 hero['name']; //"小明" 10 hero['Sex']; //男" 11 hero['say'](); //"小明: 您好!" 12 var a='name'; hero[a]; //"小明"
采用文本對象標記法定義對象要注意以下問題:
- 定義一個對象時要用{},但與函數不同的是無關鍵字 function;
- 對象內部格式: 屬性名:屬性值,不同屬性值之間用 “,” 隔開;
- 對象內部 this 表示當前對象;
- 調用對象的方法和屬性有兩種方式如下:hero.name; 和 hero['name']; 后一種類似於數組的方式可以采用動態方式
文本對象標記法與函數的區別:
文本對象標記法 | 函數 | |
區別 | 無關鍵字 function | 有關鍵字 function |
語法 | var n={} | var n=function(){}或 function n(){} |
方式二:構造器函數法:
例子:

1 function people(name) 2 { 3 this.name=name; 4 this.sex='男'; 5 this.say=function(){return this.name+': 您好!';}; 6 } 7 var hero=new people('小強'); 8 hero.name; //"小強" 9 hero.sex; //"男" 10 hero.say(); //"小強: 您好!" 11 hero['name']; //"小強" 12 hero['sex']; //"男" 13 hero['say'](); //"小強: 您好!" 14 var a='sex'; hero[a]; //"男"
采用文本對象標記法定義對象要注意以下問題:
- 構造器函數與函數類似:都有function,但構造器均有 this 指向當前對象,否則無法調用;
文本對象法與構造器函數法的不同點:
文本對象法 | 構造器函數法 | |
實例化? | 直接創建對象,無需實例化 | 創建的只是一個用於創建對象的構造器函數,必須用構造器函數法實例化對象 |
對象個數? | 只能創建一個 | 可以實例化多個對象;利用構造器函數的參數可以創建內容不一樣的對象 |
this? | 表實例化之后的對象。 |
二、實例對象、類對象
上面的構造器函數法使用 this 表示正在實例化的對象。即使用 this 的屬性是屬於實例化對象的。還有一種綁定到構造函數,表示類的屬性,類似於 C# 中的靜態屬性,是屬於所有由該構造函數實例化的對象共有的。
例:

1 function people(name,s,age){ this.name=name;sex=s;people.age=age;}; 2 var a=new people('小強','男',24); 3 var b=new people('小麗','女',20); 4 a.name; //"小強" 5 b.name; //"小麗" 6 a.sex; //undefined 7 a.age; //undefined 8 people.age; //20 9 sex; //"女"
如上實例化兩個實例,每個實例都可以訪問到屬於自己的(用 this 綁定到實例化對象的,在此為 name)屬性;使用構造器函數名綁定到類的屬性(在此為綁定到people的屬性 age )則無法使用實例化對象訪問到,只能使用構造器函數訪問到;而即未使用 this 又未使用構造器函數名綁定的屬性sex,在此為全局變量,可以直接訪問。
修改如下:
通過函數的方式訪問類屬性。
三、對象廢除
對於javascript 語言,其擁有無用存儲單元收集程序,意味着我們可以不必專門銷毀對象來釋放內存。如果再沒有對對象的引用時,當運行無用存儲單元收集程序時,即可銷毀所有的對象。但作為一個良好的習慣,把對象的所有引用都設置為 null,可以強制性地廢除對象。例如:hero=null;當對象變量 hero 設置為 null 后,對第一個創建的對象的引用就不存在了。這意味着下次運行無用存儲單元收集程序時,該對象將被銷毀。
注意:廢除對象的所有引用時要當心。如果一個對象有兩個或更多引用,則要正確廢除該對象,必須將其所有引用都設置為 null。
四、早綁定和晚綁定
綁定:把對象的接口與對象實例結合在一起的方法。
-
- 早綁定:指在實例化對象之前定義它的屬性和方法,這樣編譯器或解釋程序就能夠提前轉換機器代碼。ECMAScript 不是強類型語言,所以不支持早綁定。
- 晚綁定:編譯器或解釋程序在運行前,不知道對象的類型。使用晚綁定,無需檢查對象的類型,只需檢查對象是否支持屬性和方法即可。ECMAScript 中的所有變量都采用晚綁定方法。這樣就允許執行大量的對象操作,而無任何懲罰。
- 極晚綁定:從技術上講,根本不存在極晚綁定。本書采用該術語描述 ECMAScript 中的一種現象,即能夠在對象實例化后再定義它的方法。
例如:

1 function people(name) 2 { 3 this.name=name; 4 this.sex='男'; 5 this.say=function(){return this.name+': 您好!';}; 6 } 7 var hero=new people('小強');hero.name; //"小強" 8 people.prototype.likething=function(){return this.name+':喜歡吃零食。';}; 9 hero.likething(); //"小強:喜歡吃零食。"
在大多數程序設計語言中,必須在實例化對象之前定義對象的方法。這里,方法 sayHi() 是在創建 Object 類的一個實例之后來添加進來的。在傳統語言中不僅沒聽說過這種操作,也沒聽說過該方法還會自動賦予 Object 對象的實例並能立即使用。
注意:不建議使用極晚綁定方法,因為很難對其跟蹤和記錄。不過,還是應該了解這種可能。