google closure--繼承模塊一:goog.inherits()
最近在項目是使用了google closure框架,深入研究了一下源碼,先從最簡單的繼承系統吧。
廢話不多說,closure繼承模塊主要有2個API:
goog.inherits(childCtor,parentCtor);
goog.base(me,opt_methodName,var_args);
先看一下,goog.inherits的源碼
goog.inherits = function(childCtor, parentCtor) {
function tempCtor() {};
tempCtor.prototype = parentCtor.prototype;
childCtor.superClass_ = parentCtor.prototype;//給子構造函數添加superClass_屬性,指向父構造函數的原型對象
childCtor.prototype = new tempCtor();
childCtor.prototype.constructor = childCtor;
childCtor.base = function(me, methodName, var_args) {//子構造函數綁定base方法,調用父構造函數原型對象方法
// Copying using loop to avoid deop due to passing arguments object to
// function. This is faster in many JS engines as of late 2014.
var args = new Array(arguments.length - 2);
for (var i = 2; i < arguments.length; i++) {
args[i - 2] = arguments[i];
}
return parentCtor.prototype[methodName].apply(me, args);
};
};
代碼中有一個小技巧,就是采用利用一個空構造函數,使子構造函數的原型對象只繼承父構造函數的原型對象,構造函數內部創建時將不綁定,目的很明確,通過原型鏈只繼承父構造函數的原型對象。

這里還有2個值得注意的地方,一個是:childCtor.superClass_ = parentCtor.prototype,這個相當于在子構造函數上加一個指針superClass_指向父構造函數的原型,這個有什么作用呢?先不用著急,到后面自會揭曉。
第二個指的注意的地方是,為子構造函數添加了一個名為base的方法(不要忘記函數是一等對象哦),可以通過childCtor.base(me,method,arg),me是子構造函數的實例對象,method是想要調取父構造函數原型對象的方法名,arg是傳入的參數,這個
有點像通過子構造函數提供函數式調用父構造函數原型對象的方法。
總結一下:
通過goog.inherits()完成了:
1."干凈"的繼承父構造函數的原型對象.
2."武裝“了子構造函數,可以通過childCtor的base方法和所需方法名調用父構造函數原型對象的方法。
3.為子構造函數新加了一個屬性,指向父構造函數的原型對象。
疑問:在閱讀代碼的時候,一定會產生這樣的疑問,已經可以通過子構造函數的base訪問到父構造函數的相應方法,為什么還要為自構造函數添加一個superClass_的屬性指向父構造函數的原型對象呢?不是多次一舉了嗎?
下一章將揭曉,別忘了還有一個goog.base()呢。
看了這么多有木有同情父構造函數呢,父親奮斗了那么多年好不容易有了個prototype的小金庫,卻被兒子無情的壓榨,兒子已經享有繼承使用權了,還要自己已經有了個小金庫弄了個base的鑰匙直接用父親的小金庫。。。。。。
可憐天下父母心啊,可是有沒有想過,假如父親不準備為自己創建一個實例,這個prototype小金庫有啥用呢,還不如給兒子用。。。。。給孫子用。。。。。
有木有突然恍然大悟,原來千辛萬苦,只為一個實例。其實我猜想這段代碼的作者的想法是,通過這個簡單的api完成,多個構造函數構建一個“超級實例”的想法,可是有什么用處呢~請見下回分曉
浙公網安備 33010602011771號