脚本宝典收集整理的这篇文章主要介绍了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,请注明来意。