原型,原型對象,原型鏈,構造函數,繼承(一)

前言: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__

相關文章
相關標籤/搜索