面向對象變成的全稱爲object oriented programming, 簡稱oop。 面向對象編程時用抽象的方式建立基於現實世界模型的一種編程模式。
面向對象編程能夠看做時使用一系列對象相互協做的軟件設計。面向對象編程設計的目的時在編程中促進更好的靈活性和可維護性。憑藉其對模塊化的重視,面向對象的代碼開發更簡單,更容易理解。面向對象編程的三個重要特徵:( 1 封裝,2 繼承,3 多態)。
全部的程序是由必定的屬性和行爲對象組成的,不一樣的對象的訪問經過函數調用來完成,對詳間全部的交流都是經過方法調用,經過對封裝對象數據,提升複用率。編程
JavaScript是一種基於原型的面嚮對象語言,而不是基於類的。正是因爲這一種根本的區別,其如何建立對象的層級結構以及對象的屬性與屬性值是如何繼承的並非那麼清晰。
基於原型的語言(如JavaScript) 並非在這種區別:它只有對象。基於原型的語言具備所謂原型對象(prototypcal object) 的概念。原型對象能夠做爲一個模板,新對象能夠從中獲取原始的屬性。任何對象均可以指定其自身的屬性,既能夠是建立時也能夠在運行建立時。並且任何對象均可以做爲另外一個對象的原型(prototype),從而容許後者共享前者的屬性。json
所謂封裝就是按照要求使用並獲得對應的結果,而不須要知道其真實的執行原理是怎麼樣的
封裝主要用於闡述對象所包含的內容,他們一般由兩個部分組成:
1相關的數據(用於存儲屬性) 2基於這些數據所能做的事情數據結構
繼承一般是指類與類之間的關係。若是兩個類都具備相同的屬性或方法,那麼可讓一個繼承於另外一個類,這樣就不須要在前者再次定義一樣的屬性或方法。
建立一個或者多個類的專門版本類方式爲繼承。建立的專本版本的類一般叫作子類,另外的類一般叫作父類。在JavaScript中,繼承經過賦予子類一個父類的實例並專門化子類來實現模塊化
不一樣的對象能夠定義具備相同名稱的方法,方法是做用於所在的對象中。這種不一樣對象經過相同方法的調用實現各自行爲的能力,被稱之爲多態。函數
構造函數由稱之爲構造器或對象模板,是對象中的一個方法,在實例化是構造器被調用。在JavaScript中函數就能夠做爲構造器使用,所以不須要特別的定義一個構造器方法。
function person(){ console。log(‘person instantiated’);
}
var person = new person ();
這裏的person()並非做爲函數 而是構造函數。
建立person對象須要使用new關鍵自oop
構造函數的屬性實際上就是對象的變量。一個對象能夠包闊多個屬性,定義構造函數屬性是使用this這是關鍵字。
function Person (firstname){
this.firstname =firstName;
console.log (‘person instanttiated’);
}
var person = new person (‘Alice’);
console。log (‘person is +person。firstname’);this
構造函數的方法想構造函數的屬性,不一樣的是方法是以惡函數(或像函數一個樣被定義)。定義構造函數的方法時使用this關鍵詞。
var person = function(firstname){
this.firstname = firstName;
this.sayhello = function () {
console.log ('hello, I'm+this.firstName');prototype
};
};
var person = new person (Alice);
person.sayhello();設計
JavaScript 有一套徹底不一樣於其餘語言的對this處理機制,this 關鍵字自己沒有任何含義,好比下記中不一樣的狀況下,this指向的各類不一樣。
全局範圍內:this關鍵字會指向全局對象。
this。a = 10 //global。a=10
console.log(a);//10
構造函數內:this 關鍵字會指向新建立的對象。
構造函數的方法內:this關鍵字會指向當前對象。
var hero={};
hero.sayName = function (){
return 'hello ' +this.name;
}對象
JavaScript提供裏一個內部數據結構,用於描述對象的值,控制其行爲,例如該屬性是否可寫,是否可配置,是否修改以及是否可枚舉等。這個數據結構被稱爲'屬性描述符'。
每個屬性都有本身對應的屬性描述符,保存屬性的元信息。
{
value :‘臥龍學院’,
writable:false,
enumerable:true,
configurable:false,
get:undefined,
set:undefind
}
對象裏面目前存在的屬性描述符有兩種主要形式:數據描述符和存儲描述符。
數據描述符是一個具備值得屬性,該值多是可寫的,也可能不是可寫的。該數據描述符具備如下可選建值:
value:該屬性對應的值。能夠是任何有效的JavaScript值(數值 對象,函數等。默認爲undefined)
writable:當且僅當該屬性的writable 爲true時,value才能被賦值運算符改變。默認爲false。
configurable:當且僅當該屬性的configurable爲true時,該屬性描述符纔可以被改變,同時該屬性也能從對應的對向上被刪除。默認爲false。
enumerable:當且僅當該屬性的enumerable爲true時,該屬性纔可以出如今對向上的枚舉屬性中默認爲false
存取描述符時由getter-setter 函數對描述的屬性。存取描述符具備如下可選建值:
get:給屬性提供getter方法,若是沒有getter則爲undefined。當訪問該屬性時,該方法會被執行,方法執行時沒有參數傳入,可是會傳入this對象。
set:給屬性提供setter的方法,若是沒有setter則爲undefined。當屬性值修改時,觸發執行該方法。該方法將接受惟一參數,及該屬性新的參數值。
configurable:當且僅當該屬性的writable 爲true時 ,該屬性描述符纔可以被該表,同時屬性也能從對應的對象上被刪除。默認爲false。
enumerable:當且僅當該屬性的enumerable爲true時,該屬性纔可以出如今對象的枚舉屬性中。
默認爲false
ObjectgetowmpropretyDescriptor()方法返回指定對象上一個自由屬性對應的屬性描述符。
obj:須要查找的目標對像,
prop:目標對象內屬性名稱(string類型)。
返回值:若是指定的屬性存在於對向上,則返回其屬性描述符對象,不然返回undefined。
objectdefineproperty()方法爲對象定義屬性改變現有屬性,並返回該對象。
obj:要在其上頂會議屬性的對象。
prop:要定義或者修改的屬性名稱。
descriptor:將被定義或修改的屬性描述符。
返回值:被傳遞給函數的對象。
objectdefineproperties()方法爲對象定義一個或者多個新屬性或修改現有屬性,並返回該對象。
obj:要在其上定義屬性的對象。
props:要定義其可枚舉屬性或修改的修改屬性描述符的對象。
返回值:被傳遞給函數的對象。
writable:Boolean值,表示目標屬性的值是否能夠內修改。當且僅當該屬性的writable爲true時,value才能被賦值元算符該表。默認爲false。
configurable:Boolean值,表示目標屬性的描述符是否能夠被修改。當且僅當該屬性的configurable爲true時,該屬性描述符纔可以被該表,同時該屬性也能從對應的對向上被刪除。默認爲false
該屬性纔可以被出如今對象的枚舉屬性中。默認爲false。
若是對象的屬性的enumerable的值爲false,如下三種操做取不到的屬性:
for in
objectkey()方法
jsonstring()方法
對象的屬性除了能夠直接定義之外,還可使用存儲器進行定義。其中setter爲存儲函數,使用屬性描述符中的set;getter爲取值函數,使用屬性喵符中的get
定義的對象默認在任什麼時候候,任何位置,不管有意義的仍是無心義的均可以修改對象的屬性或方法。而這些篡改可能會影響內置屬性或方法,從而致使對象的正常功能可能沒法使用。JavaScript在ecmascrip5版本中新增字放置篡改對象的屬性或方法的機制,共提供瞭如下三級保護方式:禁止拓展:禁止爲對象擴展新的屬性或方法密封對象:禁止擴展新的屬性或方法,禁止配置現有的屬性或方法描述符,僅容許讀寫屬性的值。凍結對象:禁止對對象執行任何修改操做。