我認(rèn)為,不是不能給父類構(gòu)造函數(shù)傳參數(shù),而是傳的參數(shù)最終不能起到作用。舉個(gè)例子:
創(chuàng)新互聯(lián)公司為客戶提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、程序、域名、空間一條龍服務(wù),提供基于WEB的系統(tǒng)開發(fā). 服務(wù)項(xiàng)目涵蓋了網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站程序開發(fā)、WEB系統(tǒng)開發(fā)、微信二次開發(fā)、手機(jī)網(wǎng)站開發(fā)等網(wǎng)站方面業(yè)務(wù)。
function Parents(ln) { this.lastName=ln; } //定義父類構(gòu)造函數(shù)
function Children(fn,ln) { this.firstName=fn; } //定義子類,lastName 繼承自父類
//原型鏈繼承,給父類構(gòu)造函數(shù)傳入?yún)?shù),試圖用 Children 類構(gòu)造函數(shù)中傳入的 ln 初始化 lastName:
Children.prototype=new Parents(this ln);
//嘗試建立對(duì)象實(shí)例:
var child=new Children("Bill","Gates");
//輸出結(jié)果。很明顯,lastNmae 并沒(méi)有得到想要的值:
alert(child.firstName);//Bill
alert(child.lastName);//Undefine
這說(shuō)明給父類構(gòu)造函數(shù)傳遞參數(shù)是無(wú)效的。原因就在于原型鏈方式中,調(diào)用父類構(gòu)造函數(shù)的代碼并不在子類構(gòu)造函數(shù)中,建立對(duì)象實(shí)例時(shí)給的屬性值(即子類構(gòu)造函數(shù)的參數(shù))并不能影響到子類調(diào)用的父類構(gòu)造函數(shù)。
當(dāng)然,在繼承時(shí)可以這樣寫:
Children.prototype=new Parents("Gates");//調(diào)用父類構(gòu)造函數(shù)時(shí)給固定值
但是,這個(gè)固定的屬性值必定會(huì)影響所有子類的對(duì)象實(shí)例,相當(dāng)于子類構(gòu)造函數(shù)“擅作主張”給所有對(duì)象實(shí)例的屬性提前“賦了值”。這樣寫是不太符合面向?qū)ο缶幊痰囊?guī)則的。
在firefox中可以用Console調(diào)試 (Ctrl+Shift+K):
console.log(?var1,?var2,?var3?...)
在Web Console 中會(huì)顯示var1 var2 var3 ...,以一個(gè)空格隔開。
正如wjsl所說(shuō),定時(shí)器中
setTimeout(Student_A.wakeup,3000 )
這里是把Student_A.wakeup這個(gè)函數(shù)作為參數(shù)傳入了setTimeout函數(shù)。我們知道,函數(shù)的定義里面如果有this這個(gè)reserved word,那么它的含義取決于調(diào)用的方式。如果是用obj.function1 這種帶點(diǎn)的格式來(lái)調(diào)用,那么this就是obj。 如果是直接調(diào)用,this則是window。那么在這里3秒鐘過(guò)后,?wakeup將會(huì)被直接調(diào)用,因?yàn)槟](méi)有傳入Student_A。
解決辦法:加入一個(gè)sleep() 方法:
People.prototype?=?{?
//...
sleep:?function(duration)?{?//5?秒后wakeup
var?$this?=?this;
setTimeout(function(){
$this.wakeup();
},?duration);
},
//...
其中$this變量以當(dāng)前對(duì)象賦值。
由于js closure的特性,當(dāng)setTimeout時(shí)間到,匿名函數(shù)中的$this還是之前賦予的那個(gè)對(duì)象。所以如果運(yùn)行Student_A.sleep(5000),5秒鐘之后js engine 就會(huì)運(yùn)行Student_A.wakeup()。
(符號(hào)“$" 跟a-z,1-9 一樣,都是變量名中可以使用的字符)。
這里刪掉:
//Student子類構(gòu)造函數(shù),內(nèi)部調(diào)用超類構(gòu)造函數(shù)
function Student(name) {
People.call(this, name); //從People類繼承,同時(shí)傳遞參數(shù)name
};
Java構(gòu)造函數(shù)才是分開來(lái)寫的,javascript 中由構(gòu)造函數(shù)產(chǎn)生對(duì)象(配合 new關(guān)鍵字),并沒(méi)有類。
代碼供參考:
var?Student?=?function(classroom,?name,?age)?{?
this.classroom?=?classroom;
People.call(this,?name,?age);
};
“醒來(lái)”之后,屬性改變:
可以先sleep(),然后馬上改屬性。然后wakeup()的時(shí)候就會(huì)發(fā)現(xiàn)屬性產(chǎn)生了變化 :D
文中的?Student.prototype 在運(yùn)行 Student.prototype = new People(); 語(yǔ)句時(shí)被完全更改。所以setClass() 已經(jīng)無(wú)法調(diào)用??梢栽谥貙憌akeup時(shí)同樣定義。
JavaScript 是面向?qū)ο蟮恼Z(yǔ)言,引用數(shù)據(jù)類型都是對(duì)象,包括函數(shù)也是對(duì)象,同時(shí)還可以通過(guò) Object 對(duì)象自定義對(duì)象。\x0d\x0a但是,和其他面向?qū)ο笳Z(yǔ)言(如 Java 等高級(jí)語(yǔ)言)比,也有很大差異,JS 中沒(méi)有類或接口的概念,即不能直接定義抽象的類,也不能直接實(shí)現(xiàn)繼承。不過(guò),為了編程的方便,我們可以在 JS 中模擬類和繼承的行為。\x0d\x0a創(chuàng)建對(duì)象實(shí)例或類(雖然沒(méi)有類的概念,但是可以把用于創(chuàng)建新對(duì)象的對(duì)象看作類),可以通過(guò)構(gòu)造函數(shù)來(lái)實(shí)現(xiàn),構(gòu)造函數(shù)就是具有一系列屬性和行為作為函數(shù)體的函數(shù),可以通過(guò)函數(shù)參數(shù)傳入值。它就相當(dāng)于 Java 中類的構(gòu)造函數(shù),需要時(shí)可以通過(guò) var instanceObj = new ConstructorFunc(para1,para2,...) 來(lái)創(chuàng)建對(duì)象(實(shí)例)。\x0d\x0aJS 的對(duì)象中還有一個(gè)重要概念,即原型。每個(gè)對(duì)象都有原型,原型也是一個(gè)對(duì)象,可以看做是構(gòu)造函數(shù)的映像,是創(chuàng)建實(shí)例的模型。對(duì)象(類)的屬性 prototype 即是對(duì)原型對(duì)象的引用,創(chuàng)建實(shí)例后,也有屬性 __proto__ 指向原型對(duì)象,但該屬性是隱含的。\x0d\x0a由于不斷創(chuàng)造新對(duì)象(實(shí)例),一級(jí)一級(jí)的傳遞原型對(duì)象,即可構(gòu)成原型鏈。通過(guò)原型鏈,即可實(shí)現(xiàn)繼承。首先將父類對(duì)象的實(shí)例給子類的原型 ChildCons.prototype = new ParentCons(),再在子類構(gòu)造函數(shù)中調(diào)用父類構(gòu)造函數(shù)將繼承的屬性初始化。繼承的變通方法還有很多,可以參考一些資料。
javascript有以下五種基本數(shù)據(jù)類型
對(duì)象Object是基于上面幾種組成的復(fù)雜數(shù)據(jù)類型;至于數(shù)組類型,在js中數(shù)組類型是對(duì)象類型的子類。
包含Undefined值的變量和未定義的變量是不一樣的。
js是通過(guò)prototype實(shí)現(xiàn)的繼承,
如ClassA.prototype = new ClassB().
就可以說(shuō)ClassA是ClassB的子類,同時(shí)ClassB是ClassA的父類
js中定義一個(gè)class其實(shí)就是一個(gè)function,如
var ClassA = function() {
}
====怎么最近好像老有人問(wèn)這個(gè)?
看你這個(gè)樣子是有點(diǎn)強(qiáng)迫癥,放到里面是沒(méi)有問(wèn)題的,至于你說(shuō)的開銷,你完全是想太多。因?yàn)槟氵@個(gè)有構(gòu)造函數(shù)參數(shù),不能使用常規(guī)的方法。至于你為什么報(bào)錯(cuò),是因?yàn)锳nimal.apply(this,arguments)并沒(méi)有將Animal附加到Cat的原型鏈上,而你的move是在Animal的原型鏈上。你加一句:Cat.prototype=Animal.prototype,可以達(dá)到你想要的效果,但這個(gè)開銷問(wèn)題,有太多區(qū)別嗎?我沒(méi)有測(cè)試,你可以測(cè)試一下,呵呵。
分享名稱:javascript子類,javascript 類型
本文URL:http://jinyejixie.com/article34/dssshse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站收錄、網(wǎng)站改版、外貿(mào)建站、品牌網(wǎng)站建設(shè)、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)