javascript継承に対する理解
3368 ワード
javascriptは元々サポートされていないタイプですから、継承や多状態はもちろん、他の対象向けプログラミング言語の特性を模擬するために、多くの大牛が実現方法を書いてくれました.John Resignの「Simple JavaScript Inhersitance」という文章を見て、感服されました.もとは短い何十行のjavascriptもこのように強大で、優雅なことができて、次に私の理解の方式で解読します.
父の名前を受け継ぎ、訪問する方法を主に実現しましたが、残念なことにメンバー変数/関数の隠し方ができませんでした.
父の名前を受け継ぎ、訪問する方法を主に実現しましたが、残念なことにメンバー変数/関数の隠し方ができませんでした.
(function(){
// , new A() B=A.extends({/* */}) ;
var initializing = false,
//fnTest /\b_super\b/ /.*/
// test toString()
fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
// Class
this.Class = function(){};
//
Class.extend = function(prop) {
// _super prototype, 、
var _super = this.prototype;
// B=A.extends({/* */});
initializing = true;
// , prototype
var prototype = new this();
initializing = false;
// B=A.extends({/* */});
//
// :
//1、 prototype
//2、 this._super() , prototype
//3、 this._super() , prototype :
// this._super ,
for (var name in prop) {
// ,
// v = a && b && c ? d : e; v = (a && b && c) ? d : e
// a,b,c true v=d, v=e
//a prop[name] ,b name ,c name ( this._super())
//d a,b,c , :name , name , name
// a,b,c prop[name] prototype[name]
prototype[name] = typeof prop[name] == "function" &&
typeof _super[name] == "function" && fnTest.test(prop[name]) ?
(function(name, fn){
// , prototype[name] ,
return function() {
// , fn this._super
// return function, fn this
// _super _super, this._super ,
//var tmp = this._super;
//this._super fn( prop[name]) , fn
// this._super()
this._super = _super[name];
// , this._super , _super[name]
var ret = fn.apply(this, arguments);
//this._super = tmp;
//
return ret;
};
})(name, prop[name]) :
prop[name];
}
// “Class” “Class”
// Class
function Class() {
// A.extends({/* */})
if ( !initializing && this.init )
this.init.apply(this, arguments);
}
// prototype prototype
Class.prototype = prototype;
//
Class.prototype.constructor = Class;
//
Class.extend = arguments.callee;
return Class;
};
})();
もっと深くjs継承を知りたいなら、続けて文章を調べてください.