Javascript的繼承機制

一:在構造函數裏面的屬性和方法是不通過實例共享的;
	function A() {
        this.name = "睿睿",
        this.fn=function(){
        	console.log(this.name)
        }
    }
    var a = new A();
    var b = new A();
    //通過實例a修改構造函數本身的屬性name值
    a.name = "瑞瑞";
     //發現只有實例a的name值發生變化,實例b沒有發生變化;說明:在構造函數裏面的屬性和方法是不通過實例共享的;
    console.log(a.name);  //瑞瑞
    console.log(a.fn());  //瑞瑞
    console.log(b.name);  //睿睿
    console.log(b.fn());  //睿睿
二: 在構造函數的原型對象(prototype)裏面的屬性和方法,是所有的實例所共享的;
	function A() {
        this.name = "睿睿"
    }
    //往構造函數A的原型對象(prototype)裏面添加name屬性(prototype裏面添加的name和構造函數裏面的屬性name不一樣)
    A.prototype.name = "張睿"
    //A有倆個實例(a , b)
    var a = new A();
    var b = new A();
    //此時,a和b同時訪問A原型對象中的name屬性,獲取的是一樣的;說明:在構造函數的原型對象(prototype)裏面的屬性和方法,是所有的實例所共享的;
    console.log(a.__proto__.name);  //張睿
    console.log(b.__proto__.name);  //張睿

總結:實例對象需要共享的屬性和方法,都放在原型對象(prototype)裏面;那些不需要共享的屬性和方法,就放在構造函數裏面。

(此話來源於阮一峯老師):由於所有的實例都共享原型對象(prototype)裏面的屬性和方法,所以看起來prototype就像是所有實例對象的原型,而實例對象就像是繼承了peototype對象一樣;

完!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章