圖解JavaScript原型鏈繼承

結合閱讀:html

JS原型與原型鏈終極詳解app

對象的內部原型(__proto__)和構造器的原型(prototype)函數

JavaScript中的原型和繼承(譯文)this

 

js原型鏈繼承的是_proto_,而不是prototype。spa

構造器的實例對象的_proto_指向構造器的原型prototype。prototype

全部構造器都來自Function.prototype,甚至包括根構造器Object及Function自身。code

全部構造器/函數(Function、Object、Array、Number、Boolean、String、RegExp、Error、Date..)的_proto_都指向Function.prototype。htm

全部構造器都繼承了Function.prototype的屬性及方法(length、call、apply、bind..)。對象

全部構造器都是普通js對象,能夠給構造器添加/刪除屬性等,同時也繼承了Object.prototype上的全部方法(toString、valueOf、hasOwnProperty..)。blog

每一個對象都有一個預約義的constructor屬性,用來引用它的函數對象/構造器。constructor始終指向建立自身的構造函數。

 

補充:Function.prototype的_proto_指向Object.prototype。

數字1表示:帶有Person的this屬性;

數字2表示:帶有Person的prototype屬性;

數字3表示:帶有Object的toString、valueOf、hasOwnProperty..屬性及方法;

數字4表示:帶有Person的靜態屬性;

數字5表示:帶有Function的length、call、apply、bind..屬性及方法。

var Person = function (name) {
   this.name = name;
};
Person.prototype.getName = function () {
   return this.name; 
};
Person.age = 23;
Person.getAge = function () {};var p = new Person();//重寫原型Person.prototype = {  getName: function () {};}//重寫原型後,會致使:Person.prototype = new Object();   //constructor指向Objectp.constructor === Object;   //truePerson.prototype === Object;   //truep.constructor.prototype.constructor === Object;   //true//修正constructor指向Person.prototype.constructor = Person;
相關文章
相關標籤/搜索