日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Js 控件编写 继承:extend、mixin和plugin(一)

發布時間:2024/8/23 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Js 控件编写 继承:extend、mixin和plugin(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Js?繼承:extend、mixin和plugin(一)

?

簡介:

我們編寫前端控件時,需要給控件建立一個體系,面向對象是一個很合適的方式,但是JS本身對面向對象的一些概念支持偏弱,特別是繼承的特性方面,那么我們就必須通過一系列的方式來實現繼承。

?

Extend方式:

Extend方式非常貼近面向對象語言中的類繼承,這種方式使用原型鏈的方式來實現繼承。原型鏈的繼承方式有幾個缺點:

1)缺少針對父類的引用,例如:

?

function?A(){

//初始化A操作

}

A.prototype?=?{

method1:function(){

//A的一系列操作

}

}

function?B(){

//初始化B的操作

}

B.prototype?=?new?A();

B.method1?=?function(){

//先執行?A.method1的方法

//執行自己的方法

}

?

那么此時如何在調用A的method1方法呢?我們沒有java中的super對象也缺少C#中的base對象,當然我們可以換一種寫法,來解決這個問題:

?

var??aobj?=?new?A();?

B.prototype?=?aobj;

B.method1?=?function(){

aobj.method1.call(this);//先執行?A.method1的方法

//執行自己的方法

}

?

但是我們必須能緩存剛才的?aobj對象,方便在調用B.method1時取得到,所以我們就引入superclass字段,放在構造函數B上作為靜態屬性,調用時:B.superclass.method1.call(this),下面是實現:

?

function?extend(subclass,superclass){

var?superObj?=?new?superclass();

subclass.prototype?=?superObj;

subclass.superclass?=?superObj;

return?subclass;

}

?

上面的函數解決了superclass的問題但是又引入了新的問題,下面我們一一來講。

2)破壞了對象的constructor屬性,這個屬性在使用繼承的過程中非常有用,它指向的是對象的構造函數,例如:

?

function?A(){}

//未繼承?A時

function?B(){}

var?b?=?new?B();

alert(b.constructor?===?B)?//true

?

//B繼承A?

extend(B,A);?

b1?=?new?B();?

alert(b1.constructor?===?B)?//?false?

alert(b1.constructor?===?b.constructor)?//false

?

這樣的結果絕對不是我們需要的,否則我們在編寫方法的過程中調用,B.supercalss.constructor.call(this)?或者?B.superclass.constructor.superclass?會出現混亂,我們怎么辦呢,繼續改進extend方法,矯正constructor?屬性:

?

function?extend(subclass,superclass){

  var?superObj?=?new?superclass();

  subclass.prototype?=?superObj;

????superObj.constructor?=?subclass;//矯正?constructor屬性

  subclass.superclass?=?superObj;

  return?subclass;

}

?

到這里看似解決了繼承鏈的問題,但是此時我們來看一下下面情形:

?

function?C?(){}?

extend(C,B);

var?c?=?new?C();?

alert(c.constructor.superclass.constructor);//C

?

上面的結果意外的不是B?而是?C,這是什么原因呢,我們看剛才矯正constructor?屬性以及上面一句:

?

subclass.prototype?=?superObj;

superObj.constructor?=?subclass;

?

我們將C的prototype的constructor修改為了C?,由于subclass.superclass?=?superObj;那么C的superclass跟C?的prototype是同一個對象,那么?c.constructor.superclass.constructor等同于C.prototype.constructor?結果就是?C,那么我們需要做一下修改:

?

function?extend(subclass,superclass){

  var?superObj?=?new?superclass();

  subclass.prototype?=?superObj;

????superObj.constructor?=?subclass;//矯正?constructor屬性

  subclass.superclass?=?new?superclass();

  return?subclass;

}

?

此時我們再來調用一下:

?

alert(c.constructor.superclass.constructor);//B

?

此時的還有什么問題呢?我們來做一下實驗:

?

function?A?(config){

??console.log('a?constructor,config:'?+?config);

}

A.prototype?=?{

??method?:?function(){

????console.log('a?runing');

??}

};

function?B?(config){

??this.constructor.superclass.constructor.call(this,config);

??console.log('b?constructor,config:'?+?config);

}

extend(B,A);

function?C?(config){

??this.constructor.superclass.constructor.call(this,config);

??console.log('c?constructor,config:'?+?config);

}

extend(C,B);

var?c?=?new?C('hello');

c.method();

?

輸出結果:

?

a?constructor,config:undefined?

a?constructor,config:undefined?

b?constructor,config:undefined?

b?constructor,config:undefined?

b?constructor,config:undefined?

Uncaught?RangeError:?Maximum?call?stack?size?exceeded

?

我們看到沒有輸出我們希望的結果,這里有2個問題,

1.?產生了循環調用

2.?未實例化對象前,實例化了多個父類對象,而且這些實例初始化時傳入的參數為空,極易出現錯誤。

解決死循環我們只需要把this.constructor.superclass?替換為?對應的?B.superclass即可:

?

function?B?(config){

??B.superclass.constructor.call(this,config);

??console.log('b?constructor,config:'?+?config);

}

function?C?(config){

??C.superclass.constructor.call(this,config);

??console.log('c?constructor,config:'?+?config);

}

?

針對調用extend時生成多個實例我們引入方法:

?

function?create(proto,?c)?{

????function?F()?{

????}

????F.prototype?=?proto;

????var?o?=?new?F();

????o.constructor?=?c;

????return?o;

}

?

在extend方法中我們這樣調用:

?

var?superObj?=?create(superclass.prototype,subclass);

subclass.prototype?=?superObj;

subclass.superclass?=?create(superclass.prototype,superclass);??

?

此時我們的prototype?屬性和superclass屬性都不需要實例化對象,完整的extend方法如下:

?

function?extend(subclass,superclass){

????function?create(proto,?c)?{

????????function?F()?{

????????}

????????F.prototype?=?proto;

????????var?o?=?new?F();

????????o.constructor?=?c;

????????return?o;

????}

  var?superObj?=?create(superclass.prototype,subclass);

????subclass.prototype?=?superObj;

????subclass.superclass?=?create(superclass.prototype,superclass);?

  return?subclass;

}

?

這樣在執行上面的代碼即得到:

?

a?constructor,config:hello

b?constructor,config:hello

c?constructor,config:hello

a?runing?

?

今天先寫到這里,接下來我會把控件的繼承機制一下,如果有時間,把一些編寫js控件的經驗分享出來,希望對大家有幫助。

轉載于:https://www.cnblogs.com/zaohe/archive/2012/10/13/2723148.html

總結

以上是生活随笔為你收集整理的Js 控件编写 继承:extend、mixin和plugin(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久伊人精品视频 | 美乳在线播放 | 成人一区二区av | 国产丝袜在线视频 | 秋霞三区 | 高跟91白丝| 嫩草影院污 | 色香天天| 免费在线观看黄色 | 成年人拍拍视频 | 久久精品日韩无码 | aaaa视频| 福利视频免费看 | 91亚洲国产成人久久精品网站 | 在线一区二区三区四区五区 | 亚洲无人区小视频 | 97影视| 日韩黄色片 | 一个色av| 国产精品久久网站 | 日本少妇bbwbbw精品 | 亚洲日日骚 | 日韩免费av在线 | 91射区| 欧美三级免费 | 日韩毛片在线 | 久久嫩| 乱色精品无码一区二区国产盗 | 欧美xxxxx高潮喷水麻豆 | 免费观看黄色一级视频 | 日本一道本 | 亚洲黄色在线播放 | 亚洲666| 国产欧美在线 | 岳奶大又白下面又肥又黑水多 | 蝌蚪久久 | 骑骑上司妻电影 | 偷拍一区二区 | 春色av| 福利av在线 | 午夜福利理论片在线观看 | 成人黄色免费观看 | 欧美首页 | 欧美一区二区三区国产 | 国产精品日本一区二区在线播放 | 日韩网红少妇无码视频香港 | 日日夜夜狠 | 2020av视频| 误杀1电影免费观看高清完整版 | 免费成人深夜夜行网站视频 | 久久久精品日韩 | 夜夜爽天天操 | 91干网 | 国产又猛又黄 | 久久国产精品无码一级毛片 | 成人在线视频一区二区 | 五月天婷婷激情 | 毛片免费播放 | 男男黄色片 | 中文字幕人妻无码系列第三区 | 亚洲天堂一区二区三区 | 色呦呦在线看 | 涩涩五月天 | 户外露出一区二区三区 | 日韩一级片一区二区 | 欧美黑人一区二区三区 | av在线不卡免费看 | 亚洲视频在线观看视频 | 少妇荡乳情欲办公室456视频 | 波多野吉衣伦理片 | 久久99久久久久久 | 阿拉伯性视频xxxx | av视屏 | 亚洲欧美国产一区二区 | 扒开腿揉捏花蒂h | 国产精品一区二区三区在线播放 | 76少妇精品导航 | 成人激情四射 | 中文字幕一区二区人妻视频 | 精品乱码一区二区三区 | 亚洲自拍偷拍一区 | 在办公室被c到呻吟的动态图 | 老司机午夜免费精品视频 | 精品国产成人亚洲午夜福利 | 国产一区二区 | 国产精品黑丝 | 四季av国产一区二区三区 | 日本久久久久久 | 成人激情久久 | 日本美女性生活视频 | 日本精品视频一区二区三区 | 激情视频免费观看 | 波多野结衣精品在线 | 91偷拍精品一区二区三区 | 亚洲中文一区二区 | 欧美成人综合一区 | 国产aaa毛片| 国产做爰免费视频观看 | 手机免费看av片 |