js實例教程-JS面向對象編程學習之構造函數的繼承理解

发布时间:2018-11-23 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了js實例教程-JS面向對象編程學習之構造函數的繼承理解脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
小寶典致力於為廣大程序猿(媛)提供高品質的代碼服務,請大家多多光顧小站,小寶典在此謝過。

對象之間繼承的 5 中方法, 現在有一個"動物"對象的構造函數.

一.構造函數綁定 :使用call 或 apply 方法將父對象的構造函數綁定在子對象上

 function Animal(){  this.sPEcies = "動物"; }  function Cat(name,color){  Animal.apply(this, arguments);//Animal綁定在Cat上  this.name = name;  this.color = color; } VAR cat1 = new Cat("大毛","黃色"); alert(cat1.species);//貓科動物

二.PRototype模式,使用prototype屬性。

Cat.prototype= new Animal();

//"貓"的prototype對象,指向一個Animal的實例,那麼所有"貓"的實例,就能繼承Animal了

三.直接繼承prototype :對第二種方法改進. 由於Animal對象中, 不變的屬性都可以直接寫入 Animal.prototype. 所以,我們也可以讓 Cat()跳過AniaML(),直接繼承Animal.prototype.

 function Animal(){} Animal.prototype.species= "動物";  function Cat(name,color){  this.name = name;  this.color = color; } Cat.prototype=Animal.prototype; var cat1 = new Cat("大毛","黃色"); alert(cat1.species);//貓科動物

優點是效率比較高,比較省內存. 缺點是Cat.prototype和Animal.prototype現在指向了同一個對象,對Cat.prototype的修改,會反映到Animal.prototype.

所以,上面這一段代碼其實是有問題的.請看第二行

Cat.prototype.constructor = Cat;

這一句話實際上把Aniaml.prototype對象的constructor屬性也改掉了!

alert(Animal.prototype.constructor);//Cat

四.利用空對象作為中介: 利用一個空對象作為中介, 由於"直接繼承prototype"存在上述的缺點

var F = function(){};

F.prototype = Animal.prototype;

Cat.prototype = new F();

Cat.prototype.constructor = Cat;

F是空對象,所以幾乎不佔內存.這時,修改Cat的prototype對象,就不會影響到Animal的prototype對象.

alert(Animal.prototype.constructor);//Animal

我們將上邊的方法,封裝成一個函數,便於使用.

這個extend函數,就是YUI庫如何實現繼承的方法.

另外,說明一點,函數體最後一行

Child.uber = Parent.prototype;

意思是為子對象設一個uber屬性, 這個屬性直接指向父對象的prototype屬性.這等於在子對象上打開一條通道,可以直接調用父對象的方法.這一行放在這裡,只是為了實現繼承的完備性,純屬備用性質

 function Animal(){} Animal.prototype.species= "動物";  function Cat(name,color){  this.name = name;  this.color = color; } function extend(Child,Parent) {  var F= function () {};  F.prototype=Parent.prototype;  Child.prototype= new F();  Child.prototype.constructor=Child;  Child.uber= Parent.prototype;  } //使用方法如下: extend(Cat,Animal); var cat1 = Cat("大毛","黃色"); alert(cat1.species)

五.拷貝繼承 把父對象的所有屬性和方法拷貝進子對象實現繼承

 //首先,還是把Animal的所有不變屬性, 都放到它的prototype對象上. function Animal(){}; Animal.prototype.species = "動物";  function Cat(name,color){  this.name = name;  this.color = color; } //然後,再寫一個函數,實現屬性拷貝的目的. function extend2(Child, Parent){     var p = Parent.prototype;     var c = Child.prototype;     for(var i in p){      c[i] = p[i];     }     c.uber = p; } extent2(Cat,Animal); var cat1 = new Cat("大毛","黃色"); alert(cat1.species);//動物 

這個函數的作用,就是將父對象的prototype對象中的屬性,一一拷貝給Child對象的prototype對象.

對象之間繼承的 5 中方法, 現在有一個"動物"對象的構造函數.

一.構造函數綁定 :使用call 或 apply 方法將父對象的構造函數綁定在子對象上

 function Animal(){  this.species = "動物"; }  function Cat(name,color){  Animal.apply(this, arguments);//Animal綁定在Cat上  this.name = name;  this.color = color; } var cat1 = new Cat("大毛","黃色"); alert(cat1.species);//貓科動物

二.Prototype模式,使用prototype屬性。

Cat.prototype= new Animal();

//"貓"的prototype對象,指向一個Animal的實例,那麼所有"貓"的實例,就能繼承Animal了

三.直接繼承prototype :對第二種方法改進. 由於Animal對象中, 不變的屬性都可以直接寫入 Animal.prototype. 所以,我們也可以讓 Cat()跳過Aniaml(),直接繼承Animal.prototype.

 function Animal(){} Animal.prototype.species= "動物";  function Cat(name,color){  this.name = name;  this.color = color; } Cat.prototype=Animal.prototype; var cat1 = new Cat("大毛","黃色"); alert(cat1.species);//貓科動物

優點是效率比較高,比較省內存. 缺點是Cat.prototype和Animal.prototype現在指向了同一個對象,對Cat.prototype的修改,會反映到Animal.prototype.

所以,上面這一段代碼其實是有問題的.請看第二行

Cat.prototype.constructor = Cat;

這一句話實際上把Aniaml.prototype對象的constructor屬性也改掉了!

alert(Animal.prototype.constructor);//Cat

四.利用空對象作為中介: 利用一個空對象作為中介, 由於"直接繼承prototype"存在上述的缺點

var F = function(){};

F.prototype = Animal.prototype;

Cat.prototype = new F();

Cat.prototype.constructor = Cat;

F是空對象,所以幾乎不佔內存.這時,修改Cat的prototype對象,就不會影響到Animal的prototype對象.

alert(Animal.prototype.constructor);//Animal

我們將上邊的方法,封裝成一個函數,便於使用.

這個extend函數,就是YUI庫如何實現繼承的方法.

另外,說明一點,函數體最後一行

Child.uber = Parent.prototype;

意思是為子對象設一個uber屬性, 這個屬性直接指向父對象的prototype屬性.這等於在子對象上打開一條通道,可以直接調用父對象的方法.這一行放在這裡,只是為了實現繼承的完備性,純屬備用性質

 function Animal(){} Animal.prototype.species= "動物";  function Cat(name,color){  this.name = name;  this.color = color; } function extend(Child,Parent) {  var F= function () {};  F.prototype=Parent.prototype;  Child.prototype= new F();  Child.prototype.constructor=Child;  Child.uber= Parent.prototype;  } //使用方法如下: extend(Cat,Animal); var cat1 = Cat("大毛","黃色"); alert(cat1.species)

五.拷貝繼承 把父對象的所有屬性和方法拷貝進子對象實現繼承

 //首先,還是把Animal的所有不變屬性, 都放到它的prototype對象上. function Animal(){}; Animal.prototype.species = "動物";  function Cat(name,color){  this.name = name;  this.color = color; } //然後,再寫一個函數,實現屬性拷貝的目的. function extend2(Child, Parent){     var p = Parent.prototype;     var c = Child.prototype;     for(var i in p){      c[i] = p[i];     }     c.uber = p; } extent2(Cat,Animal); var cat1 = new Cat("大毛","黃色"); alert(cat1.species);//動物 

這個函數的作用,就是將父對象的prototype對象中的屬性,一一拷貝給Child對象的prototype對象.

覺得可用,就經常來吧!Javascript技巧 腳本寶典 歡迎評論哦! js技巧,巧奪天工,精雕玉琢。小寶典獻醜了!

脚本宝典总结

以上是脚本宝典为你收集整理的js實例教程-JS面向對象編程學習之構造函數的繼承理解全部内容,希望文章能够帮你解决js實例教程-JS面向對象編程學習之構造函數的繼承理解所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。