Skip to content

Instantly share code, notes, and snippets.

@mapserver2007
Created May 12, 2011 03:02
Show Gist options
  • Save mapserver2007/967863 to your computer and use it in GitHub Desktop.
Save mapserver2007/967863 to your computer and use it in GitHub Desktop.
親子関係を維持したオブジェクト継承
Object.prototype.mix = function(o) {
var child = this,
parent = {},
ppropList = [];
var contains = function(ary, value) {
for (var i in ary) {
if (ary.hasOwnProperty(i) && ary[i] === value) {
return true;
}
}
return false;
};
// for IE
if (!!document.attachEvent) {
for (prop in o) if (!contains(ppropList, prop)) {
child[prop] = o[prop];
}
}
// for Modern Browsers
else {
// Objectの独自拡張メソッドは追加しない
for (var pprop in Object.prototype) {
ppropList.push(pprop);
}
for (var prop in o) if (!contains(ppropList, prop)) {
parent[prop] = o[prop];
}
// __proto__の深さを探索する
var depth = 0, _c = child;
for (;;) {
_c = _c.__proto__;
if (_c !== null) {
depth++;
}
else {
break;
}
}
// 一番上の親を辿り__proto__にオブジェクトを連結する
var plist = ["child"];
for (var i = 1; i <= depth; i++) {
plist[i] = "__proto__";
};
eval(plist.join(".") + " = parent");
}
return child;
};
Object.prototype.parent = function() {
return !!document.attachEvent ? this : this.__proto__;
};
var Telephone = {
getPhoneName: function() {
return "kurodenwa";
},
getType: function() {
return "old type";
}
};
var Feature = {
getPhoneName: function() {
return "garake-";
}
};
var Iphone = {
getPhoneName: function() {
return "iphone";
}
};
// 複数継承
var o1 = Iphone.mix(Feature).mix(Telephone);
console.log(o1);
// 子
console.log(o1.getPhoneName()); // iphone
console.log(o1.parent().getPhoneName()); //garake-
console.log(o1.parent().parent().getPhoneName()); // kurodenwa
console.log(o1.getType()); // old type
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment