關於javascript類特性的一些總結

衆所周知,在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() );
相關文章
相關標籤/搜索