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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【翻译】理念:无冲突的扩展本地DOM原型

發(fā)布時(shí)間:2025/3/17 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【翻译】理念:无冲突的扩展本地DOM原型 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

菜鳥翻譯,望大家多多指正哈

原文:http://lea.verou.me/2015/04/idea-extending-native-dom-prototypes-without-collisions/

理念:無沖突的擴(kuò)展本地DOM原型

正如我昨天在博文中指出,我不喜歡使用jQuery的原因之一是因?yàn)樗陌b對(duì)象。對(duì)于jQuery來說,這是一個(gè)明智的決定:早在2006年它被第一次開發(fā)出來的時(shí)候,IE有一個(gè)非常討厭的內(nèi)存泄漏bug,當(dāng)我們給一個(gè)元素添加屬性時(shí)它便很容易被引發(fā)出來。哦,那時(shí)我們還沒有在IE瀏覽器訪問元素的原型,所以我們必須手動(dòng)在每個(gè)元素上添加這些屬性。Prototype.js試圖走這條路但結(jié)果卻是一團(tuán)糟:他們打算改變他們之前在Prototype2.0版和依附包裝對(duì)象的決定。有人曾寫過很長的文章來批判企圖擴(kuò)展本地DOM元素是多么典型的錯(cuò)誤想法。

??第一個(gè)暴露元素原型的IE瀏覽器是IE8:我們可以訪問Node.prototype,Element.prototype和其他幾種原型。有些是多變的,有些則不是。在IE9,我們得到了全部,包括HTMLElement.prototype及其后代節(jié)點(diǎn),比如HTMLParagraphElement。內(nèi)存泄漏bug在IE8時(shí)得到了改善,到IE9時(shí)則得到了修復(fù)。但我們還是不要擴(kuò)展原生的DOM元素,理由很充分:有沖突的風(fēng)險(xiǎn)。沒有哪個(gè)函數(shù)庫想在元素上添加一堆方法,這種方式很糟糕, 就像被邀請(qǐng)到別人家做客,結(jié)果卻把人家家里弄的一團(tuán)亂。

??但是,如果我們可在避免沖突的條件下對(duì)元素添加方法呢?(好吧,從技術(shù)上講,可能性很小)。我們只能對(duì)元素添加一個(gè)屬性,然后把我們所有的方法都附著上去。例如:如果我們的函數(shù)庫為yolo并有兩個(gè)方法:foo()和bar(),就像這樣:

var element = document.querySelector(".someclass"); element.yolo.foo(); element.yolo.bar(); //你甚至可以鏈?zhǔn)椒祷厮麄兊脑?/span> element.yolo.foo().yolo.bar();

可以肯定,這比包裝對(duì)象更別扭,但是我認(rèn)為使用本地DOM元素所帶來的好處要大于它。當(dāng)然,你可能不這么認(rèn)為。

??這基本上同我們做全局是完全一樣的:我們都知道,添加大量的全局變量是不可取的做法,所以每一個(gè)函數(shù)庫都只創(chuàng)建一個(gè)全局變量并把所有方法屬性都附著在這個(gè)全局上。? 然而,如果我們?cè)噲D以這種天真的方式來實(shí)施,我們會(huì)發(fā)現(xiàn) 用我們的命名空間函數(shù)來引用元素是有些難度的:

Element.prototype.yolo = {foo: function () {console.log(this); },bar: function () { /* ... */ }}; someElement.yolo.foo(); // Object {foo: function, bar: function}

這里發(fā)生了什么?函數(shù)中的this指向的調(diào)用他們的對(duì)象,而不是對(duì)象所附著的那個(gè)元素,想要避開這個(gè)問題我們需要更聰明點(diǎn)。

??記住:Yolo里的this?指向我們?cè)噲D掛載方法的元素,但是我們沒有運(yùn)行任何代碼,所以我們沒有利用它。除非我們能夠得到一個(gè)引用該對(duì)象的上下文。然而,運(yùn)行一個(gè)function (例如element.yolo(). foo())會(huì)毀壞我們良好的API。

??稍等一下,我們可以通過ES5獲得權(quán)限!我們這樣做:

Object.defineProperty(Element.prototype, "yolo", {get: function () {return {element: this,foo: function() {console.log(this.element);}, bar: function() { /* ... */ }}},configurable: true,writeable: false}); someElement.yolo.foo(); // It works! (打印出該元素)

這個(gè)方法奏效,但是這里有一個(gè)相當(dāng)惱人的問題:我們每次生成該對(duì)象和重新定義函數(shù)都要調(diào)用該屬性。這是一個(gè)很壞的想法。理想情況下,我們需要生成該對(duì)象,然后返回生成的對(duì)象。我們也不想讓每個(gè)元素都有自己完全獨(dú)立的實(shí)例,我們想在原型上定義這些函數(shù),并且用JS完美的繼承,因此,我們的庫也是動(dòng)態(tài)可擴(kuò)展的。幸運(yùn)的是,有一種方法可以做到這一切:

var Yolo = function(element) {this.element = element; };Yolo.prototype = {foo: function() {console.log(this.element);},bar: function() { /* ... */ } };Object.defineProperty(Element.prototype, "yolo", {get: function () {Object.defineProperty(this, "yolo", {value: new Yolo(this)});return this.yolo;},configurable: true,writeable: false });someElement.yolo.foo(); // 成功! (打印出元素)// 它也是可以動(dòng)態(tài)擴(kuò)展的 Yolo.prototype.baz = function(color) {this.element.style.background = color; };someElement.yolo.baz("red") // 元素獲得了一個(gè)紅色背景

注意,上面我們所提到的getter只執(zhí)行一次。之后它用一個(gè)靜態(tài)值:一個(gè)yolo對(duì)象的實(shí)例重寫了yolo屬性。因?yàn)槲覀冇?到Object.define Property()所以也不會(huì)遇到破壞枚舉的問題(for..in循環(huán)),這些屬性默認(rèn)enumerable: false。這里任然有一個(gè)不足:這些方法需要用this.element來替代this。我們可以通過封裝他們來解決這一問題:

for (let method in Yolo.prototype) {Yolo.prototype[method] = function(){var callback = Yolo.prototype[method];Yolo.prototype[method] = function () {var ret = callback.apply(this.element, arguments);// 可鏈?zhǔn)椒祷卦?return ret === undefined? this.element : ret;}} }

然而,現(xiàn)在你不能動(dòng)態(tài)的在Yolo.prototype上添加方法并讓他們像element.yolo里的本地方法那樣自動(dòng)運(yùn)行。所以它是有點(diǎn)痛的可擴(kuò)展性(當(dāng)然,你仍然可以用this.element來添加方法,也是可行的)。?

??你的想法?

?

轉(zhuǎn)載于:https://www.cnblogs.com/chayangge/p/4515088.html

總結(jié)

以上是生活随笔為你收集整理的【翻译】理念:无冲突的扩展本地DOM原型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产又粗又猛又爽 | juliaannxxxxx高清| 9l视频自拍蝌蚪9l视频 | 国产精品久久久网站 | 精品理论片 | 国产波霸爆乳一区二区 | 亚洲乱码一区 | 91老师国产黑色丝袜在线 | 亚洲精品少妇 | 日韩av成人在线观看 | 欧美老熟妇一区二区三区 | 催眠调教艳妇成肉便小说 | 中日韩黄色大片 | 中国老太婆性做爰 | 金鱼妻日剧免费观看完整版全集 | 人妻熟女一区二区aⅴ水野 91在线观看视频 | 亚洲v欧美v另类v综合v日韩v | 精品久久BBBBB精品人妻 | 精品人体无码一区二区三区 | 国产swag在线观看 | 国产一区免费在线观看 | 成人青青草 | 国产精品老牛影院99av | 亚洲天堂一区二区三区 | 国产精品一区在线观看你懂的 | 欧美午夜性春猛交 | 综合久久激情 | 亚洲精品乱码久久久久久久 | 欧美性受黑人性爽 | 亚洲国产精品无码久久久 | 蜜臀av性久久久久av蜜臀妖精 | 亚洲色欲色欲www | 中文字幕十一区 | 国产精品爱啪在线线免费观看 | 久久亚洲综合色图 | aaaaaaa毛片 | va在线播放 | 国产亚洲一区二区三区 | 日韩av中文字幕在线播放 | 激情无码人妻又粗又大 | 亚洲av无码一区二区三区网址 | 美女少妇一区二区 | 欧美黑人一区二区三区 | 婷婷久久一区 | 日韩中文字幕视频在线观看 | 久久av网址| 国产靠逼视频 | 嫩草视频在线观看视频 | 黑人干亚洲 | 久爱视频在线 | 日本在线激情 | 国产精品久久久久久久裸模 | 高h校园不许穿内裤h调教 | 免费看污的网站 | 久草热线| 欧美第五页 | 日韩精品成人一区 | 欧美成人黄色网 | 波多野结衣欧美 | 97国产成人无码精品久久久 | 婷婷麻豆 | 毛片在线播放视频 | 亚洲国产欧美在线人成 | 免费超碰在线 | 国产精品毛片在线 | 久久久黄色 | 日韩精品中文字幕一区二区三区 | 欧美成人一区二区三区四区 | 国产精品久久久久久久久久久久久久久 | 国产精品男女 | 欧美日韩精品区别 | 国产精品久久综合视频 | 大肉大捧一进一出好爽视频动漫 | 免费看国产黄色片 | 中文字幕在线字幕中文 | 中文字幕国产一区 | 久久天天躁狠狠躁夜夜av | 成人在线网址 | 国产毛片一区二区三区 | 麻豆tube| 久久无码视频一区 | 国产在线xxxx | 在线免费看污视频 | 69av导航| 牛牛精品一区 | 亚色视频在线 | 亚洲一区二区三区久久久成人动漫 | 操操操插插插 | 欧美日韩高清在线播放 | 丁香婷婷综合激情五月色 | 电影中文字幕 | 国产日韩欧美一区二区东京热 | 国产精品毛片在线 | 少妇脚交调教玩男人的视频 | 国产妻精品一区二区在线 | 91国内精品久久久久 | 久久久久性色av无码一区二区 | 香蕉一区二区三区四区 | 黄色日皮视频 |