不錯(cuò)的一篇關(guān)于javascript-prototype繼承
更新時(shí)間:2007年08月31日 21:21:47 作者:
1.最基本的用法 把ClassA的一個(gè)實(shí)例賦值給ClassB,
ClassB就繼承了ClassA的所有屬性。
代碼入下:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
2.從原型繼承理論的角度去考慮,
js的原型繼承是引用原型,不是復(fù)制原型,
所以,修改原型會(huì)導(dǎo)致所有B的實(shí)例的變化。
代碼如下:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
3.然而 子類(lèi)對(duì)象的寫(xiě)操作只訪(fǎng)問(wèn)子類(lèi)對(duì)象中成員,
它們之間不會(huì)互相影響,因此,
寫(xiě)是寫(xiě)子類(lèi) 讀是讀原型(如果子類(lèi)中沒(méi)有的話(huà))。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
4.每個(gè)子類(lèi)對(duì)象都執(zhí)有同一個(gè)原型的引用,
所以子類(lèi)對(duì)象中的原型成員實(shí)際是同一個(gè)。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
5.構(gòu)造子類(lèi)時(shí) 原型的構(gòu)造函數(shù)不會(huì)被執(zhí)行
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
6.接下來(lái)是致命的,在子類(lèi)對(duì)象中訪(fǎng)問(wèn)原型的成員對(duì)象:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
7.所以 在prototype繼承中 原型類(lèi)中不能有成員對(duì)象! 所有成員必須是值類(lèi)型數(shù)據(jù)(string也可以)
用prototype繼承有執(zhí)行效率高,不會(huì)浪費(fèi)內(nèi)存,為父類(lèi)動(dòng)態(tài)添置方法后子類(lèi)中馬上可見(jiàn)等的優(yōu)點(diǎn)。
8.prototype繼承是通過(guò)把子類(lèi)的原型對(duì)象(prototype)設(shè)置成父類(lèi)的一個(gè)實(shí)例來(lái)進(jìn)行繼承的。
9.prototype繼承也有四個(gè)比較明顯的缺點(diǎn):
缺點(diǎn)一:父類(lèi)的構(gòu)造函數(shù)不是像JAVA中那樣在給子類(lèi)進(jìn)行實(shí)例化時(shí)執(zhí)行的,而是在設(shè)置繼承的時(shí)候執(zhí)行的,并且只執(zhí)行一次。這往往不是我們希望的,特別是父類(lèi)的構(gòu)造函數(shù)中有一些特殊操作的情況下。
缺點(diǎn)二:由于父類(lèi)的構(gòu)造函數(shù)不是在子類(lèi)進(jìn)行實(shí)例化時(shí)執(zhí)行,在父類(lèi)的構(gòu)造函數(shù)中設(shè)置的成員變量到了子類(lèi)中就成了所有實(shí)例對(duì)象公有的公共變量。由于JavaScript中繼承只發(fā)生在“獲取”屬性的值時(shí),對(duì)于屬性的值是String,Number和Boolean這些數(shù)據(jù)本身不能被修改的類(lèi)型時(shí)沒(méi)有什么影響。但是Array和Object類(lèi)型就會(huì)有問(wèn)題。
缺點(diǎn)三:如果父類(lèi)的構(gòu)造函數(shù)需要參數(shù),我們就沒(méi)有辦法了。
缺點(diǎn)四:子類(lèi)原本的原型對(duì)象被替換了,子類(lèi)本身的constructor屬性就沒(méi)有了。在類(lèi)的實(shí)例取它的constructor屬性時(shí),取得的是從父類(lèi)中繼承的constructor屬性,從而constructor的值是父類(lèi)而不是子類(lèi)。
10.可以針對(duì)prototype的缺點(diǎn)進(jìn)行改造
比如把它寫(xiě)成Function對(duì)象的一個(gè)方法,這樣用的時(shí)候方便。
Function.prototype.Extends = function (parentClass)
{
var Bs = new Function();
Bs.prototype = parentClass.prototype;
this.prototype = new Bs();
this.prototype.Super = parentClass;
this.prototype.constructor = this;
}
希望各位 js 高手能把更好的方式介紹給大家
針對(duì)第3,6個(gè)
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
針對(duì)繼承,
Array.prototype 就不能繼承 ClassA,ClassB
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
帶參數(shù)的繼承問(wèn)題
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
ClassB就繼承了ClassA的所有屬性。
代碼入下:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
2.從原型繼承理論的角度去考慮,
js的原型繼承是引用原型,不是復(fù)制原型,
所以,修改原型會(huì)導(dǎo)致所有B的實(shí)例的變化。
代碼如下:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
3.然而 子類(lèi)對(duì)象的寫(xiě)操作只訪(fǎng)問(wèn)子類(lèi)對(duì)象中成員,
它們之間不會(huì)互相影響,因此,
寫(xiě)是寫(xiě)子類(lèi) 讀是讀原型(如果子類(lèi)中沒(méi)有的話(huà))。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
4.每個(gè)子類(lèi)對(duì)象都執(zhí)有同一個(gè)原型的引用,
所以子類(lèi)對(duì)象中的原型成員實(shí)際是同一個(gè)。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
5.構(gòu)造子類(lèi)時(shí) 原型的構(gòu)造函數(shù)不會(huì)被執(zhí)行
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
6.接下來(lái)是致命的,在子類(lèi)對(duì)象中訪(fǎng)問(wèn)原型的成員對(duì)象:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
7.所以 在prototype繼承中 原型類(lèi)中不能有成員對(duì)象! 所有成員必須是值類(lèi)型數(shù)據(jù)(string也可以)
用prototype繼承有執(zhí)行效率高,不會(huì)浪費(fèi)內(nèi)存,為父類(lèi)動(dòng)態(tài)添置方法后子類(lèi)中馬上可見(jiàn)等的優(yōu)點(diǎn)。
8.prototype繼承是通過(guò)把子類(lèi)的原型對(duì)象(prototype)設(shè)置成父類(lèi)的一個(gè)實(shí)例來(lái)進(jìn)行繼承的。
9.prototype繼承也有四個(gè)比較明顯的缺點(diǎn):
缺點(diǎn)一:父類(lèi)的構(gòu)造函數(shù)不是像JAVA中那樣在給子類(lèi)進(jìn)行實(shí)例化時(shí)執(zhí)行的,而是在設(shè)置繼承的時(shí)候執(zhí)行的,并且只執(zhí)行一次。這往往不是我們希望的,特別是父類(lèi)的構(gòu)造函數(shù)中有一些特殊操作的情況下。
缺點(diǎn)二:由于父類(lèi)的構(gòu)造函數(shù)不是在子類(lèi)進(jìn)行實(shí)例化時(shí)執(zhí)行,在父類(lèi)的構(gòu)造函數(shù)中設(shè)置的成員變量到了子類(lèi)中就成了所有實(shí)例對(duì)象公有的公共變量。由于JavaScript中繼承只發(fā)生在“獲取”屬性的值時(shí),對(duì)于屬性的值是String,Number和Boolean這些數(shù)據(jù)本身不能被修改的類(lèi)型時(shí)沒(méi)有什么影響。但是Array和Object類(lèi)型就會(huì)有問(wèn)題。
缺點(diǎn)三:如果父類(lèi)的構(gòu)造函數(shù)需要參數(shù),我們就沒(méi)有辦法了。
缺點(diǎn)四:子類(lèi)原本的原型對(duì)象被替換了,子類(lèi)本身的constructor屬性就沒(méi)有了。在類(lèi)的實(shí)例取它的constructor屬性時(shí),取得的是從父類(lèi)中繼承的constructor屬性,從而constructor的值是父類(lèi)而不是子類(lèi)。
10.可以針對(duì)prototype的缺點(diǎn)進(jìn)行改造
比如把它寫(xiě)成Function對(duì)象的一個(gè)方法,這樣用的時(shí)候方便。
Function.prototype.Extends = function (parentClass)
{
var Bs = new Function();
Bs.prototype = parentClass.prototype;
this.prototype = new Bs();
this.prototype.Super = parentClass;
this.prototype.constructor = this;
}
希望各位 js 高手能把更好的方式介紹給大家
針對(duì)第3,6個(gè)
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
針對(duì)繼承,
Array.prototype 就不能繼承 ClassA,ClassB
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
帶參數(shù)的繼承問(wèn)題
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
相關(guān)文章
初學(xué)prototype,發(fā)個(gè)JS接受URL參數(shù)的代碼
初學(xué)prototype,發(fā)個(gè)JS接受URL參數(shù)的代碼...2007-01-01Prototype Selector對(duì)象學(xué)習(xí)
這個(gè)對(duì)象在幫助文檔上并沒(méi)有,但是這個(gè)對(duì)象確是整個(gè)DOM操作的核心類(lèi),工具函數(shù)$$,其實(shí)就是調(diào)用這個(gè)類(lèi)的方法2009-07-07由prototype_1.3.1進(jìn)入javascript殿堂-類(lèi)的初探
由prototype_1.3.1進(jìn)入javascript殿堂-類(lèi)的初探...2006-11-11prototype 1.5 & scriptaculous 1.6.1 學(xué)習(xí)筆記
prototype 1.5 & scriptaculous 1.6.1 學(xué)習(xí)筆記...2006-09-09Prototype的Class.create函數(shù)解析
Prototype中的類(lèi)的創(chuàng)建,一般使用Class.create方法來(lái)創(chuàng)建,例如PeriodicalExecuter類(lèi)型。使用的時(shí)候通過(guò)調(diào)用new PeriodicalExecuter(xxx)來(lái)生成對(duì)象。2011-09-09動(dòng)態(tài)表格Table類(lèi)的實(shí)現(xiàn)
文件名:Table.js本文件依賴(lài)于 prototype.js,prototype_ext.js,Lib.js,DataBinder.js這些文件請(qǐng)參看我的其它文章2009-08-08