[セットトップ]JavaScript類継承実現の一つ
2659 ワード
JavaScriptのクラスのデフォルトは原型の対象を通じて継承されます.
var Person = function() {
this.name = "people";
this.hello = function() {
console.log("hello user:" + this.name);
}
}
var User = function() {
this.name = "user";
this.hello = function() {
User.prototype.hello.call(this, arguments);
console.log("hello user:" + this.name);
}
}
User.prototype = new Person();
new User().hello();
にJavaScriptのクラスをJavaのように、superキーワードである父親タイプを呼び出す方法がありますか?(function() {
Function.prototype.extend = function(baseClass) {
// this is a function object.
var oldPrototype = this.prototype, newPrototype = {}, _super = new baseClass();
//inherits all properties and methods.
for ( var name in _super) {
newPrototype[name] = _super[name];
}
for ( var name in oldPrototype) {
// only override properties in this new Class.
if (oldPrototype.hasOwnProperty(name)) {
// only function need _super.
if (typeof oldPrototype[name] == "function" && typeof _super[name] == "function") {
newPrototype[name] = (function(name, fn) {
return function() {
var tmp = this._super;
// set super method
this._super = _super[name];
var ret = fn.apply(this, arguments);
this._super = tmp;
return ret;
};
})(name, oldPrototype[name]);
} else {
newPrototype[name] = oldPrototype[name];
}
}
}
this.prototype = newPrototype;
return this;
};
})();
テストコードvar A = function() {
this.hello = function() {
console.log("hello, I'm A");
}
};
var B = function() {};
B.prototype = {
hello : function() {
this._super();
console.log("hello, I'm B");
}
};
B.extend(A);
var C = function() {};
C.prototype = {
hello : function() {
this._super();
console.log("hello, I'm C");
}
};
C.extend(B);
var b = new B();
var c = new C();
//b.hello();
c.hello();
結果hello, I'm A
hello, I'm B
hello, I'm C