yui3 plugin無限遞迴bug

2021-08-25 03:03:09 字數 1468 閱讀 9399

在 pluginhost-debug.js 中有段**:

pluginhost.plug = function(hostclass, plugin, config) 

};

其中的if是為了防止在 y.base 設定外掛程式。

外掛程式例項初始化:

外掛程式繼承於y.plugin.base, 由於 yui3 的設計 ,y.plugin.base 繼承於 y.base ,y.base 又 augment 自pluginhost 則在 使用外掛程式時,外掛程式需要例項化,例項化時當呼叫到 y.base 的構造函函式:

function plugin(config)
而 y.base的建構函式則會由於augment自pluginhost,呼叫 _initplugins 而 _initplugins 則會取得所有繼承鏈構造器:

var classes = (this._getclasses) ? this._getclasses() : [this.constructor],
即: y.base ,y.plugin.base,以及當前外掛程式構造器本身,對這幾個構造器的plugins進行例項化,但是如果 y.base 有 plugins ,則在初始化 y.base的外掛程式時,又會回到本段開頭進入無限遞迴。

由上分析可知,確實不可以對 y.base 進行plug ,但是同時也看到也不能對 y.plugin.base以及外掛程式構造器進行 plug,原因同上,但是 yui3只考慮了不可以對 y.base進行 if判斷,卻沒有對y.plugin.base以及外掛程式構造器本身進行判斷,修正如下:

if (hostclass !== y.base) 

hostclass=original;

}

測試**:

若沒有上步修正會導致無限遞迴

yui().use("base","event","node","event-simulate","event-custom","node-event-simulate","plugin","oop","pluginhost",function(y)

y.extend(testplugin,y.plugin.base);

testplugin.name="testplugin";

testplugin.ns="testplugin_ns";

//plug y.plugin.base

y.plugin.host.plug(y.plugin.base,testplugin);

//plug自身

y.plugin.host.plug(testplugin,testplugin);

y.node.plug(testplugin);

//開始無限遞迴

var node=y.one("body");

console.log("done");

});

YUI3元件框架之plugin

plugin功能包括如下幾個模組,簡單分析如下 pluginhost base 維護物件 this.plugins 並提供方法 plug unplug hasplug destroyplugins initplugins plug 初始化外掛程式例項,並與host進行關聯 if plugin l.i...

YUI 3 學習筆記 queue base

今天 yui 3 發布了 beta 1,實在是高興。繼續學習原始碼 queue base.一點心得 yui3 beta1 的 yui seed,與pr1 的架構圖 已經有了稍許不同 增加了 queue base 模組。queue base 的原始碼非常簡單,就是乙個包裝後的陣列。封裝後的介面非常有 ...

YUI3學習(一) 入門

學習yui3有一段時間,並且應用在了一些小專案的前端開發中,感覺還是蠻不錯的,所以決定開始記錄下yui3的學習歷程和個人經驗。yui3在前身yui2基礎上進行了大量的重新設計,並不只是簡單的版本公升級。yui3強調 重用,將功能做了級別劃分和顆粒化的設計。在概念上抽象出 核心 工具 和元件類,分別放...