国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

前端開發(fā)必須知道的JS之原型和繼承_js面向?qū)ο?/h1>
來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 20:54:05
文檔

前端開發(fā)必須知道的JS之原型和繼承_js面向?qū)ο?/h4>
前端開發(fā)必須知道的JS之原型和繼承_js面向?qū)ο?一. 原型與構(gòu)造函數(shù) Js所有的函數(shù)都有一個prototype屬性,這個屬性引用了一個對象,即原型對象,也簡稱原型。這個函數(shù)包括構(gòu)造函數(shù)和普通函數(shù),我們講的更多是構(gòu)造函數(shù)的原型,但是也不能否定普通函數(shù)也有原型。譬如普通函數(shù): 代碼如下: function
推薦度:

導(dǎo)讀前端開發(fā)必須知道的JS之原型和繼承_js面向?qū)ο?一. 原型與構(gòu)造函數(shù) Js所有的函數(shù)都有一個prototype屬性,這個屬性引用了一個對象,即原型對象,也簡稱原型。這個函數(shù)包括構(gòu)造函數(shù)和普通函數(shù),我們講的更多是構(gòu)造函數(shù)的原型,但是也不能否定普通函數(shù)也有原型。譬如普通函數(shù): 代碼如下: function

一. 原型與構(gòu)造函數(shù)

  Js所有的函數(shù)都有一個prototype屬性,這個屬性引用了一個對象,即原型對象,也簡稱原型。這個函數(shù)包括構(gòu)造函數(shù)和普通函數(shù),我們講的更多是構(gòu)造函數(shù)的原型,但是也不能否定普通函數(shù)也有原型。譬如普通函數(shù):
代碼如下:
function F(){
  alert(F.prototype instanceof Object) //true;
}

  構(gòu)造函數(shù),也即構(gòu)造對象。首先了解下通過構(gòu)造函數(shù)實(shí)例化對象的過程。
代碼如下:
function A(x){
  this.x=x;
}
var obj=new A(1);

實(shí)例化obj對象有三步:

  1. 創(chuàng)建obj對象:obj=new Object();

  2. 將obj的內(nèi)部__proto__指向構(gòu)造他的函數(shù)A的prototype,同時,obj.constructor===A.prototype.constructor(這個是永遠(yuǎn)成立的,即使A.prototype不再指向原來的A原型,也就是說:類的實(shí)例對象的constructor屬性永遠(yuǎn)指向"構(gòu)造函數(shù)"的prototype.constructor),從而使得obj.constructor.prototype指向A.prototype(obj.constructor.prototype===A.prototype,當(dāng)A.prototype改變時則不成立,下文有遇到)。obj.constructor.prototype與的內(nèi)部_proto_是兩碼事,實(shí)例化對象時用的是_proto_,obj是沒有prototype屬性的,但是有內(nèi)部的__proto__,通過__proto__來取得原型鏈上的原型屬性和原型方法,F(xiàn)ireFox公開了__proto__,可以在FireFox中alert(obj.__proto__);

  3. 將obj作為this去調(diào)用構(gòu)造函數(shù)A,從而設(shè)置成員(即對象屬性和對象方法)并初始化。

  當(dāng)這3步完成,這個obj對象就與構(gòu)造函數(shù)A再無聯(lián)系,這個時候即使構(gòu)造函數(shù)A再加任何成員,都不再影響已經(jīng)實(shí)例化的obj對象了。此時,obj對象具有了x屬性,同時具有了構(gòu)造函數(shù)A的原型對象的所有成員,當(dāng)然,此時該原型對象是沒有成員的。

  原型對象初始是空的,也就是沒有一個成員(即原型屬性和原型方法)。可以通過如下方法驗(yàn)證原型對象具有多少成員。
代碼如下:
var num=0;
for(o in A.prototype) {
  alert(o);//alert出原型屬性名字
  num++;
}
alert("member: " + num);//alert出原型所有成員個數(shù)。

  但是,一旦定義了原型屬性或原型方法,則所有通過該構(gòu)造函數(shù)實(shí)例化出來的所有對象,都繼承了這些原型屬性和原型方法,這是通過內(nèi)部的_proto_鏈來實(shí)現(xiàn)的。

  譬如

  A.prototype.say=function(){alert("Hi")};

  那所有的A的對象都具有了say方法,這個原型對象的say方法是唯一的副本給大家共享的,而不是每一個對象都有關(guān)于say方法的一個副本。

二. 原型與繼承

  首先,看個簡單的繼承實(shí)現(xiàn)。
代碼如下:
function A(x){
  this.x=x;
}
function B(x,y){
  this.tmpObj=A;
  this.tmpObj(x);
  delete this.tmpObj;
  this.y=y;
}

  第5、6、7行:創(chuàng)建臨時屬性tmpObj引用構(gòu)造函數(shù)A,然后在B內(nèi)部執(zhí)行,執(zhí)行完后刪除。當(dāng)在B內(nèi)部執(zhí)行了this.x=x后(這里的this是B的對象),B當(dāng)然就擁有了x屬性,當(dāng)然B的x屬性和A的x屬性兩者是獨(dú)立,所以并不能算嚴(yán)格的繼承。第5、6、7行有更簡單的實(shí)現(xiàn),就是通過call(apply)方法:A.call(this,x);

這兩種方法都有將this傳遞到A的執(zhí)行里,this指向的是B的對象,這就是為什么不直接A(x)的原因。這種繼承方式即是類繼承(js沒有類,這里只是指構(gòu)造函數(shù)),雖然繼承了A構(gòu)造對象的所有屬性方法,但是不能繼承A的原型對象的成員。而要實(shí)現(xiàn)這個目的,就是在此基礎(chǔ)上再添加原型繼承。


  通過下面的例子,就能很深入地了解原型,以及原型參與實(shí)現(xiàn)的完美繼承。(本文核心在此^_^)
代碼如下:
function A(x){
  this.x = x;
}
A.prototype.a = "a";
function B(x,y){
  this.y = y;
  A.call(this,x);
}
B.prototype.b1 = function(){
  alert("b1");
}
B.prototype = new A();
B.prototype.b2 = function(){
  alert("b2");
}
B.prototype.constructor = B;
var obj = new B(1,3);

  這個例子講的就是B繼承A。第7行類繼承:A.call(this.x);上面已講過。實(shí)現(xiàn)原型繼承的是第12行:B.prototype = new A();

  就是說把B的原型指向了A的1個實(shí)例對象,這個實(shí)例對象具有x屬性,為undefined,還具有a屬性,值為"a"。所以B原型也具有了這2個屬性(或者說,B和A建立了原型鏈,B是A的下級)。而因?yàn)榉讲诺念惱^承,B的實(shí)例對象也具有了x屬性,也就是說obj對象有2個同名的x屬性,此時原型屬性x要讓位于實(shí)例對象屬性x,所以obj.x是1,而非undefined。第13行又定義了原型方法b2,所以B原型也具有了b2。雖然第9~11行設(shè)置了原型方法b1,但是你會發(fā)現(xiàn)第12行執(zhí)行后,B原型不再具有b1方法,也就是obj.b1是undefined。因?yàn)榈?2行使得B原型指向改變,原來具有b1的原型對象被拋棄,自然就沒有b1了。

  第12行執(zhí)行完后,B原型(B.prototype)指向了A的實(shí)例對象,而A的實(shí)例對象的構(gòu)造器是構(gòu)造函數(shù)A,所以B.prototype.constructor就是構(gòu)造對象A了(換句話說,A構(gòu)造了B的原型)。

alert(B.prototype.constructor)出來后就是"function A(x){...}" 。同樣地,obj.constructor也是A構(gòu)造對象,alert(obj.constructor)出來后就是"function A(x){...}" ,也就是說B.prototype.constructor===obj.constructor(true),但是B.prototype===obj.constructor.prototype(false),因?yàn)榍罢呤荁的原型,具有成員:x,a,b2,后者是A的原型,具有成員:a。如何修正這個問題呢,就在第16行,將B原型的構(gòu)造器重新指向了B構(gòu)造函數(shù),那么B.prototype===obj.constructor.prototype(true),都具有成員:x,a,b2。

  如果沒有第16行,那是不是obj = new B(1,3)會去調(diào)用A構(gòu)造函數(shù)實(shí)例化呢?答案是否定的,你會發(fā)現(xiàn)obj.y=3,所以仍然是調(diào)用的B構(gòu)造函數(shù)實(shí)例化的。雖然obj.constructor===A(true),但是對于new B()的行為來說,執(zhí)行了上面所說的通過構(gòu)造函數(shù)創(chuàng)建實(shí)例對象的3個步驟,第一步,創(chuàng)建空對象;第二步,obj.__proto__ === B.prototype,B.prototype是具有x,a,b2成員的,obj.constructor指向了B.prototype.constructor,即構(gòu)造函數(shù)A;第三步,調(diào)用的構(gòu)造函數(shù)B去設(shè)置和初始化成員,具有了屬性x,y。雖然不加16行不影響obj的屬性,但如上一段說,卻影響obj.constructor和obj.constructor.prototype。所以在使用了原型繼承后,要進(jìn)行修正的操作。

  關(guān)于第12、16行,總言之,第12行使得B原型繼承了A的原型對象的所有成員,但是也使得B的實(shí)例對象的構(gòu)造器的原型指向了A原型,所以要通過第16行修正這個缺陷。

  畢了。

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

前端開發(fā)必須知道的JS之原型和繼承_js面向?qū)ο?/h4>
前端開發(fā)必須知道的JS之原型和繼承_js面向?qū)ο?一. 原型與構(gòu)造函數(shù) Js所有的函數(shù)都有一個prototype屬性,這個屬性引用了一個對象,即原型對象,也簡稱原型。這個函數(shù)包括構(gòu)造函數(shù)和普通函數(shù),我們講的更多是構(gòu)造函數(shù)的原型,但是也不能否定普通函數(shù)也有原型。譬如普通函數(shù): 代碼如下: function
推薦度:

標(biāo)簽: js 必須要 對象
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 女人18毛片a级毛片一区②区 | 国产免费网 | 亚洲综合欧美日本另类激情 | 精品久久久久久久一区二区手机版 | 亚洲一区日韩二区欧美三区 | 精品国产91乱码一区二区三区 | 国产小视频在线免费观看 | 国产成人高清亚洲一区久久 | 国产一区二区精品久 | 亚洲精品高清国产一久久 | 高清精品一区二区三区一区 | 一区在线看 | 欧美日韩一区二区在线观看 | 国产精品亚洲专区在线观看 | 久久国产经典 | 国产成人精品免费视频大全可播放的 | 亚欧精品在线观看 | 日本韩国一区 | 欧美日韩在线视频 | 91色欧美 | 精品国产免费一区二区三区五区 | 亚洲夜夜骑 | 国内精品久久久久久久aa护士 | 可以看的毛片 | 亚洲毛片视频 | 欧美一区二区三区免费播放 | 91视频一区 | 国产91精品久久久久999 | 欧美性猛交一区二区三区精品 | 欧美性受一区二区三区 | 亚洲精品国产综合一线久久 | 精品视频在线观看免费 | 欧美视频精品一区二区三区 | 亚洲欧美综合 | 亚州色图欧美色图 | 久久99国产精品成人欧美 | 成人看片黄a毛片 | 精品国产一区二区三区免费看 | 精品国产综合成人亚洲区 | 99久久精品国产综合一区 | 亚洲国产精品免费在线观看 |