1. 程式人生 > >js原型繼承

js原型繼承

prot str parent 就會 function ren fin 不存在 需要

function對象結構(Persion) Persion{ eat:f() __proto__:Object{ constructor: } }
_proto__ 屬性,它是對象所獨有的
__proto__屬性都是由一個對象指向一個對象,即指向它們的原型對象
它的作用就是當訪問一個對象的屬性時,如果該對象內部不存在這個屬性,
那麽就會去它的__proto__屬性所指向的那個對象裏找,如果父對象也不存在這個屬性,
則繼續往父對象的__proto__屬性所指向的那個對象裏找,如果還沒找到,
則繼續往上找…直到原型鏈頂端null,此時若還沒找到,則返回undefined
prototype屬性 它是函數所獨有的,它是從一個函數指向一個對象。它的含義是函數的原型對象,
也就是這個函數(其實所有函數都可以作為構造函數)所創建的實例的原型對象
prototype屬性 作用就是包含可以由特定類型的所有實例共享的屬性和方法,
也就是讓該函數所實例化的對象們都可以找到公用的屬性和方法。任何函數在創建的時候,
其實會默認同時創建該函數的prototype對象

p.proto === Persion.prototype,它們兩個完全一樣

總結:
1、我們需要牢記兩點:①__proto__和constructor屬性是對象所獨有的;
  ② prototype屬性是函數所獨有的,因為函數也是一種對象,所以函數也擁有__proto__和constructor屬性。

 2、__proto__屬性的作用就是當訪問一個對象的屬性時,如果該對象內部不存在這個屬性,
    那麽就會去它的__proto__屬性所指向的那個對象(父對象)裏找,一直找,直到__proto__屬性的終點null,
    然後返回undefined,通過__proto__屬性將對象連接起來的這條鏈路即我們所謂的原型鏈。

 3、prototype屬性的作用就是讓該函數所實例化的對象們都可以找到公用的屬性和方法,
    即p.__proto__ === Persion.prototype。

 4、constructor屬性的含義就是指向該對象的構造函數,所有函數(此時看成對象了)最終的構造函數都指向Function
 代碼:
 //function繼承
function inherits(Child, Parent) {
    var F = function() { };
    F.prototype = Parent.prototype;
    Child.prototype = new F();//修改子類prototype指向
    //任何一個prototype對象都有一個constructor屬性,指向它的構造函數
    //由於修改了child prototype為F則對應的constructor會指向F的prototype的constructor(也就指向了Parent的構造函數了),
    //所以要對應設置一個prototype的contructor
    Child.prototype.constructor = Child;
    Child.super = Parent.prototype;//設置super屬性,方便調用父類的prototype方法
}

js原型繼承