如下討論中,咱們以Animal
做爲父類,Cat
做爲子類,使Cat
繼承Animal
。javascript
//父類Animal function Animal(){ this.species="動物"; } //子類Cat function Cat(name, color){ this.name=name; this.color=color; }
使用
call、apply
方法,將父對象的構造函數綁定在子對象上.java
代碼以下:app
function Cat(name, color){ Animal.call(this, arguments); this.name=name; this.color=color; }
若是
Cat.prototype
對象指向一個Animal
實例,那麼全部的Cat
的實例就能繼承Animal
了.函數
代碼以下:this
/** *每一個構造函數都有一個原型對象(prototype),這個原型對象是這個函數全部實例的原型(proto). *每一個原型對象都有一個constructor屬性,指向它的構造函數. *每一個實例也有一個constructor屬性,默認調用prototype的constructor屬性. */ //將Cat的原型對象設置爲Animal的實例 Cat.prototype=new Animal(); //手動糾正Cat.prototype.constructor , 若是不糾正將指向Animal Cat.prototype.constructor=Cat;
因爲
Animal
對象中,不變的屬性均可以直接寫入Animal.prototype
中,因此咱們能夠讓Cat
跳過Animal
,直接繼承Animal.prototype
.prototype
代碼以下:code
//改寫Animal function Animal(){} Animal.prototype.species="動物"; //將Cat.prototype指向Animal.prototype,就完成了繼承 Cat.prototype=Animal.prototype; //手動糾正constructor指向 Cat.prototype.constructor=Cat;
空對象幾乎不佔用空間,且這時修改
Cat
的prototype
對象,不會影響Animal
的prototype
對象.對象
代碼以下:繼承
var F=function(){}; F.prototype=Animal.prototype; //將原型執行一個空對象 Cat.prototype=new F(); //仍是手動修改constructor的指向 Cat.prototype.constructor=Cat;
能夠將上面的方法封裝成一個函數ip
function extend(child, parent){ var F=function(){}; F.prototype=parent.prototype; child.prototype=new F(); child.prototype.constructor=child; }
prototype
指向,切記糾正constructor
的指向 。