javascript——對象的概念——創建對象與銷毀對象


一、創建對象

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();    //"小強:喜歡吃零食。"
View Code

  在大多數程序設計語言中,必須在實例化對象之前定義對象的方法。這里,方法 sayHi() 是在創建 Object 類的一個實例之后來添加進來的。在傳統語言中不僅沒聽說過這種操作,也沒聽說過該方法還會自動賦予 Object 對象的實例並能立即使用。

注意:不建議使用極晚綁定方法,因為很難對其跟蹤和記錄。不過,還是應該了解這種可能。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM