面向對象是一種對現實世界理解和抽象的方法,是計算機編程技術發展到一定階段后的產物。
對象的含義
對象可以是汽車,人,動物,文字,表單或者任何存在的事物等等。
對象有:
屬性-------對象的某些特定的性質。
方法-------對象能做的事情。
事件-------能響應發生在對象上的事情。
我們可以通過創建一個人的對象來理解面向對象
人:
兩只手,兩只腳,一個頭,還可以跑動。
手,腳,頭,是人的屬性,跑動是人的方法。
首先,我們來用最簡單的方法創建一個對象
1 var person = { 2 head: "one", 3 hand: "two", 4 foot: "two", 5 run : function(){ 6 console.log("running"); 7 } 8 }
這個方法一點都不實用,因為它是創建一個單獨的對象,,而這個對象和任何常見的數據結構沒有任何聯系。
然后,我們用構造函數的方式創建一個對象
1 var Person = function(){//注意,首字母大寫 2 this.head = "one", 3 this.hand = "two", 4 this.foot = "two", 5 this.run = function(){ 6 alert("running"); 7 } 8 } 9 var Joan = new Person(); 10 document.write(Joan.run())// "running"
這是用構造函數創建的對象,然后我們再加上一行代碼看看
1 var Niki = new Person(); 2 alert(Joan==Niki) //false;
是的,現在創建了是兩個不同的對象實例。
在JavaScript中的每個函數都有一個prototype的屬性.如果某個函數被用作構造函數,則這個屬性會被自動通過new調用創建對象的原型
console.log(Joan)
可以看到有一個__proto__:Person,其中__proto__是Joan的原型鏈.它是指向Person的原型.
JS在創建對象(不論是普通對象還是函數對象)的時候,都有一個叫做__proto__的內置屬性,用於指向創建它的函數對象的原型對象prototype。
關於原型鏈的一些理解,在JavaScript高級程序設計 一書中寫的非常詳細。有興趣的可以去看看,網上也有pdf的文檔可以找到。不過建議還是買本書,支持原版嘛。
然后對prototype這個原型屬性的任何更改能夠應用於用new Person()構造的每一個實例對象,不管它是在更改之前還是更改后創建.為Person.prototype 添加新函數.具體如下:
1 var Person = function(){//注意,首字母大寫 2 this.head = "one", 3 this.hand = "two", 4 this.foot = "two" 5 } 6 Person.prototype.run = function(){ 7 alert("running"); 8 } 9 var Joan = new Person(); 10 Joan.run()// "running" 11 alert(Joan.__proto__===Person.prototype)//'true'
可以看到,在原型中創建方法是可以調用的,同時Joan的原型鏈是指向Person的原型的。
再看:
1 var Niki = new Person();//"runing" 2 Person.prototype.run = function(){ 3 alert("running running") 4 } 5 Joan.run()//"running running" 6 Niki.run()//"running running"
看,修改Person的原型方法,所有被new Person()創建的對象實例中的方法都被修改了,因為所有實例中共用的是同一個原型方法run。這就是原型的一種應用。
這就是關於創建對象的一些理解。
寫了好久。也不知道有沒有錯誤。 如果有錯誤,歡迎各位大大指點。
下次再寫面向對象繼承方面的東西。