前言:javascript中 萬物皆對象 , 可是對象是有區別的 分爲普通對象(object)和函數對象(function):javascript
①由如下三種形式建立的對象爲函數對象:java
function fun1(){} var fun2 = function(){} var fun3 = new Function(); console.log(typeof fun1);//function console.log(typeof fun2);//function console.log(typeof fun3);//function
②其他建立的對象都爲普通對象;函數
③Object , Function , Array , Map , Date ......等js中的內置對象都是經過new Function()創造的 , 因此:this
console.log(typeof Function);//function console.log(typeof Object);//function console.log(typeof Array);//function console.log(typeof Map);//function
④在js中 ,每當定義一個對象 , 都會包含一些預約的屬性 , 其中函數對象就有一個屬性叫prototypespa
⑤普通對象沒有prototype屬性 , 可是有__proto__屬性prototype
⑥prototype(原型對象)就是普通對象 , 除了Function.prototype(function)指針
log(typeof obj1.__proto__);//object
console.log(typeof fun1.prototype);//object console.log(typeof fun1.prototype.__proto__);//object console.log(typeof Object.prototype);//object console.log(typeof Function.prototype);//function
一.什麼是__proto__(原型):code
每一個對象都有__proto__屬性 , __proto__指向建立他的構造函數的原型對象(實例指向原型對象的指針).對象
二.什麼是prototype(原型對象):blog
每一個函數都有一個prototype屬性,這個屬性是指向一個對象的引用,這個對象稱爲原型對象,原型對象包含函數實例共享的方法和屬性,也就是說將函數用做構造函數調用(使用new操做符調用)的時候,新建立的對象會從原型對象上繼承屬性和方法。原型是一個對象,其餘對象能夠經過它實現繼承。
做用:主要用來繼承,實現繼承靠的是原型鏈
若是構造函數和構造函數的原型對象都有同一個方法 , 那麼對優先繼承構造函數的 , 在js底層 , 通常都是給父構造函數的原型對象添加方法 .
var Student = function(){ this.name = 'lily'; } Student.prototype.name = function(){ return "mike"; } var stu = new Student(); console.log(stu.name); //'lily'
//__proto__屬性是實例指向原型對象的指針 , 如下是原型鏈表示代碼
console.log(stu.__proto__ === Student.prototype);//true console.log(Student.prototype.__proto__ === Object.prototype);//true console.log(Object.prototype.__proto__ === null);//true
console.log(Student.__proto__ === Function.prototype);
console.log(Object.__proto__ === Function.prototype);
console.log(Function.__proto__ === Function.prototype);
console.log(Function.prototype.__proto__ === Object.prototype);
console.log(Object.prototype.__proto__ === null);
三.原型鏈:
原型鏈總結:
1.繼承的實現並非靠prototype,而是靠__proto__ 2.原型鏈的做用,在於讀取對象的某個屬性時,js引擎會優先查找對象自己的屬性,若是沒有,會去該對象的構造函數的原型對象(prototype)上面找,一直找到最頂層的原型對象,Object.prototype , 若是尚未則返回undefine 3.這個過程當中,維持上下層關係靠的是__proto__