學習Javascript中的對象用法學習筆記

來源:互聯網
上載者:User

     Javascript是物件導向的,對象分為兩類,一種是普通對象,一種是方法對象。普通對象包含"數字","日期","使用者自訂對象"(如{})。

下面我們看看"使用者自訂對象"和"方法對象":

自訂對象:

Javascript是有一種object的資料類型,但是這和C#,vb.net以及java中的對象有很大的不同。如C#中我們是通過類建立一個對象,一個類相當於建立對象的模板,定義了對象的屬性和方法,這些對象和方法將是永遠固定,我們不能在運行時增加對象的屬性和方法(只能編譯時間繼承來實現)。

在Javascript沒有類的定義,建立對象時沒有固定的模板,可以動態添加新的屬性和方法,在動態添加新屬性的時候,我們能做的就是為這個屬性建立新的值,下面的例子就是建立一個對象並增加x,y兩個屬性。

var Programmer = new Object();
Programmer.name = "Charles";
Programmer.age = 21;
alert(Programmer.name + " : " + Programmer.age);

JavaScript對象完全不同於c#或vb對象,JavaScript對象可以看成一組健/值對的集合,用對象.屬性名稱來訪問一個對象屬性。我們可以把JavaScript對象看成.NET framework中Dictionary類,我們可以通過"[]"操作符來建立對象屬性。

var Programmer = new Object();
Programmer["name"] = "Charles";
Programmer["age"]= 21;
document.getElementById("message").innerHTML=Programmer["name"] + " : " + Programmer["age"];
alert(Programmer.name + " : " + Programmer.age);

   通過上面的例子可以發現兩種訪問對象的方法是一樣的。如果一個屬性沒有建立,將返回"undefined"。
我們同樣可以將函數添加為健/值對集合的值,這樣就構建為對象的方法,

var Programmer = new Object();
Programmer["name"] = "Charles";
Programmer.age= 21;
Programmer.speak=function(){
                alert(this.name + " : " + this["age"]);
             }
Programmer.speak();

上面的代碼看起來不是很清楚一個對象具體包含的屬性和對象。下面是另一種寫法:

var Programmer = 
{
     name : "Charle",
     age : 21,
     speak : function(){ alert(this.name + " : " + this.age); }
}
Programmer.speak();

上面的代碼很清晰的看出一個對象包含哪些屬性和方法,很多javascript架構中都用了這種寫法.JSON (Javascript Object Notation),Json是一個輕量級的資料交換格式,同時也易於機器解釋和產生,文法也非常嚴格,JSON允許在互連網上交換資料,我們可以用eval()方法把json對象轉換成javascript對象。

var Programmer="({name: CharlesChen,age : 21})";
var p = eval(Programmer);
alert(p.name + ',' + p.age);

 

方法對象:

方法對象就是我們通常說的Function對象,在Javascript中,方法的確是被當作對象來處理的。

function func() {alert('Hello!');}   
alert(func.toString());  

在這個例子中,func雖然是作為一個方法定義的,但它自身卻包含一個toString()方法,說明func在這裡是被當作一個對象來處理的,更準確的說是一個"方法對象",

func.name = “I am func.”;   
alert(func.name);

 

我們可以為func設定屬性,這更是證明了func是一個對象,那麼方法對象和普通對象有什麼區別呢?首先方法對象當然是可以執行的,在它後加上一對括弧,就是執行這個方法對象了。如:"func()"

所以方法對象具有雙重性,一方面它可以被執行,另一方面它可以被當作一個普通的對象來使用,這意味著什麼呢?這意味著方法對象是可以完全獨立於其他對象存在的。這一點我們可以同C#比較一下。在C#中,方法必須在某一個類中定義,而不能單獨存在。而C#中就不需要。

方法對象獨立於其他方法,就意味著它能夠被任意的引用和傳遞。下面是一個例子:

function invoke(f) {   
    f();   
}   
invoke(func);  

將一個方法對象 func 傳遞給另一個方法對象 invoke,讓後者在適當的時候執行 func。這就是所謂的“回調”了。另外,方法對象的這種特殊性,也使得 this 關鍵字不容易把握。這方面相關文章不少,這裡不贅述了。
除了可以被執行以外,方法對象還有一個特殊的功用,就是它可以通過 new 關鍵字來建立普通對象。

話說每一個方法對象被建立時,都會自動的擁有一個叫 prototype 的屬性。這個屬性並無什麼特別之處,它和其他的屬性一樣可以訪問,可以賦值。不過當我們用 new 關鍵字來建立一個對象的時候,prototype 就起作用了:它的值(也是一個對象)所包含的所有屬性,都會被複製到新建立的那個對象上去。下面是一個例子:

func.prototype.name=”prototype of func”;   
var f = new func();   
alert(f.name);  

執行的過程中會彈出兩個對話方塊,後一個對話方塊表示 f 這個建立的對象從 func.prototype 那裡拷貝了 name 屬性。而前一個對話方塊則表示 func 被作為方法執行了一遍。你可能會問了,為什麼這個時候要還把 func 執行一遍呢?其實這個時候執行 func,就是起“建構函式”的作用。為了形象的說明,我們重新來一遍:

function func() {   
    this.name=”name has been changed.”   
}   
func.prototype.name=”prototype of func”;   
var f = new func();   
alert(f.name);  

你就會發現 f 的 name 屬性不再是"prototype of func",而是被替換成了"name has been changed"。這就是 func 這個對象方法所起到的“建構函式”的作用。所以,在 JavaScript 中,用 new 關鍵字建立對象是執行了下面三個步驟的:

  1. 建立一個新的普通對象;
  2. 將方法對象的 prototype 屬性的所有屬性複製到新的普通對象中去。
  3. 以新的普通對象作為上下文來執行方法對象。

對於“new func()”這樣的語句,可以描述為“從 func 建立一個新對象”。總之,prototype 這個屬性的唯一特殊之處,就是在建立新對象的時候了。

那麼我們就可以利用這一點。比如有兩個方法對象 A 和 B,既然從 A 建立的新對象包含了所有 A.prototype 的屬性,那麼我將它賦給 B.prototype,那麼從 B 建立的新對象不也有同樣的屬性了?寫成代碼就是這樣:

A.prototype.hello = function(){alert('Hello!');}   
B.prototype = new A();   
new B().hello();  

這就是 JavaScript 的所謂“繼承”了,其實質就是屬性的拷貝,這裡利用了 prototype 來實現。如果不用 prototype,那就用迴圈了,效果是一樣的。所謂“多重繼承”,自然就是到處拷貝了。
JavaScript 中物件導向的原理,就是上面這些了。自始至終我都沒提到“類”的概念,因為 JavaScript 本來就沒有“類”這個東西。物件導向可以沒有類嗎?當然可以。先有類,然後再有對象,這本來就不合理,因為類本來是從對象中歸納出來的,先有對象再有類,這才合理。像下面這樣的:

Code
var o = {}; // 我發現了一個東西。   
o.eat = function(){return "I am eating."}  // 我發現它會吃;   
o.sleep = function(){return "ZZZzzz"}  // 我發現它會睡;   
o.talk = function(){return "Hi!"} // 我發現它會說話;   
o.think = function(){return "Hmmm"} // 我發現它還會思考。   
  
var Human = new Function(); // 我決定給它起名叫“人”。   
Human.prototype = o; // 這個東西就代表了所有“人”的概念。   
  
var h = new Human(); // 當我發現其他同它一樣的東西,   
alert(h.talk()) // 我就知道它也是“人”了!  

 

以上內容並非原創,摘自以下兩篇文章,為了便於學習,經過了部分修改,所以歸納成一篇文章:希望給初學者一點協助:

原文:  http://www.javaeye.com/topic/155109 

         http://www.cnblogs.com/young18/archive/2007/05/28/761927.html
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.