原型,原型對象,原型鏈,構造函數,繼承(一)
前言:javascript中 萬物皆對象 , 但是對象是有區別的 分為普通對象(object)和函數對象(function):
①由以下三種形式創建的對象為函數對象:
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()創造的 , 所以:
console.log(typeof Function);//function console.log(typeof Object);//function console.log(typeof Array);//function console.log(typeof Map);//function
④在js中 ,每當定義一個對象 , 都會包含一些預定的屬性 , 其中函數對象就有一個屬性叫prototype
⑤普通對象沒有prototype屬性 , 但是有__proto__屬性
⑥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(typeofFunction.prototype);//function
一.什麽是__proto__(原型):
每個對象都有__proto__屬性 , __proto__指向創建他的構造函數的原型對象(實例指向原型對象的指針).
二.什麽是prototype(原型對象):
每個函數都有一個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__
原型,原型對象,原型鏈,構造函數,繼承(一)