国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

解析John Resig Simple JavaScript Inheritance代碼

2024-05-06 14:20:42
字體:
來源:轉載
供稿:網友

由于作者翻譯會加入 自己的理解 以便自己學習和使用, 如果英文好的同學可看下面   如文章中有翻譯錯誤還請留言. 交流并改正. (:
======================Enein翻譯=========================

        John Resig 寫了一篇關于 JavaScript 里 類似其它語言的 "繼承", 靈感來自于  base2 and PrototypeJS.  他為文章起名為"Simple JavaScript Inheritance" . 他使用的一些很巧妙的技術來實現 super 方法.
        你還可以看原文也會有詳細的說明, 他也在他的 "Secrets of a JavaScript Ninja"里有所介紹. 在書中可能方法有一些不同, 它在Object中加入了subClass 方法, 而不是創建一個全局變量.
Original Script - John Resig Simple JavaScript Inheritance
下面是原諒代碼, 我移除了一些注釋使用它看起來更清晰.
代碼如下:
(function(){
var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? //b_super/b/ : /.*/;
this.Class = function(){};
Class.extend = function(prop) {
var _super = this.prototype;
initializing = true;
var prototype = new this();
initializing = false;
for (var name in prop) {
prototype[name] = typeof prop[name] == "function" &&
typeof _super[name] == "function" && fnTest.test(prop[name]) ?
(function(name, fn){
return function() {
var tmp = this._super;
this._super = _super[name];
var ret = fn.apply(this, arguments);
this._super = tmp;
return ret;
};
})(name, prop[name]) :
prop[name];
}
function Class() {
if ( !initializing && this.init )
this.init.apply(this, arguments);
}
Class.prototype = prototype;
Class.constructor = Class;
Class.extend = arguments.callee;
return Class;
};
})();

Breakdown of the Simple Inheritance script
下面我們來分析一下, 它是如何實現和有哪些技術被使用.

代碼如下:
(function(){ // ... })();

首先我們創建一個自執行匿名函數, 為代碼創建一個作用域.

代碼如下:     
var initializing = false

這 initializing 變量意思很直接, 它是boolean來檢查Class Function(稍后介紹)什么時候被調用. 在創建實例時設置 initializing 為true/false 或者只是返回一個對象指向當前的原型鏈上來達到"繼承"的目的.

如果我們創建一個實例(initializing == false), 正好Class有一個init方法, 這樣 init 會自動執行。 再或者, 如果我們僅僅將它分配給原型上(initializing == true), 將不會發生什么, init 方法不會被執行。這樣做是為了避免 每次調用構造方法都要執行 init 方法. (var prototype = new this());.

代碼如下:
fnTest = /xyz/.test(function(){xyz;}) ? //b_super/b/ : /.*/;

          這個fnTest的目的就是為了驗證 class method 中是否使用了 "_super()" 調用. 這種技術叫做 " function decompilation(函數反編譯)" 也叫做 "function serialisation(函數序列化)", Function serialisation 是在一個函數被轉換成字符串時發生的. 現在很多瀏覽器都支持 toString 方法。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 千阳县| 东海县| 梅河口市| 蕉岭县| 梁平县| 游戏| 灵川县| 正镶白旗| 自治县| 登封市| 卓资县| 萝北县| 莱州市| 嵊州市| 怀来县| 平阴县| 四平市| 治县。| 清丰县| 乌拉特中旗| 濉溪县| 西宁市| 云安县| 英山县| 鲜城| 巨野县| 东乌珠穆沁旗| 苏尼特左旗| 三台县| 永寿县| 华蓥市| 丹凤县| 临西县| 辽宁省| 海城市| 太和县| 榆中县| 八宿县| 叶城县| 昔阳县| 崇仁县|