1. 程式人生 > >原型,原型對象,原型鏈,構造函數,繼承(一)

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

都是 mce image 定義 內置 alt 作用 總結 _屬性

前言: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(typeof
Function.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__

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