衆所周知,在javascript這門動態類型語言中,是不存在如傳統靜態類型語言如c++或java中對類的支持的。後者是天生爲面向對象編程而設計,其中涉及的一些概念如繼承、多態、函數重載在js中都不是被原生實現的。javascript
然而,js也是能夠實現面向對象編程的,一切都歸功於其原型編程範形特性。也就是說,一切數據類型均可以被看作是對象(js中還存在Number,String,Boolean這樣的基本數據類型),要產生一個對象,不是經過用類進行實例化,而是克隆另外一個對象。被克隆的對象稱之爲新對象的原型,新對象保存一個指向其原型的引用。當調用新對象中的某個屬性時,若是不存在,則會順着原型鏈一直往上查找,直達Object.prototype這個js中的根對象爲止,如不存在則爲undefined。java
注:js中的全部對象都是直接或者間接克隆Object.prototype, 這是一個空對象。c++
那麼如何克隆/產生一個對象呢?
答: 在js中能夠經過new func()的形式,這裏的func是一個function,但這裏並不做爲普通的函數調用,而是做爲一個構造器。而這個函數就是經過這個函數構造出來的對象的構造函數。編程
一個對象是如何與其原型聯繫起來的呢?
答:對象的__proto__屬性指向其構造函數的prototype。
例如,var obj = new Object(); 那麼就存在 obj.__porto__ === Object.prototype。 app
如何實現繼承呢?函數
(1)使構造函數A的prototype等於另外一個構造函數B的一個實例(A.prototype = new B() ),這樣就使得A繼承於B。this
(2)使用apply方法,使B函數可以借用A函數:prototype
var A = function( name ){ this.name = name; }; var B = function(){ A.apply( this, arguments ); }; B.prototype.getName = function(){ return this.name; }; var b = new B( 'xiao' ); console.log( b.getName() );