Skip to content

Instantly share code, notes, and snippets.

@mapserver2007
Created May 17, 2011 02:52
Show Gist options
  • Save mapserver2007/975811 to your computer and use it in GitHub Desktop.
Save mapserver2007/975811 to your computer and use it in GitHub Desktop.
プロトタイプベースOOP試作その1
Object.prototype.mix = function() {
var obj = arguments,
propList = [];
// Objectの独自拡張メソッドは追加しない
for (var pprop in Object.prototype) {
propList.push(pprop);
}
// Object拡張したプロパティに該当すればtrue
var contains = function(value) {
for (var i in propList) {
if (propList.hasOwnProperty(i) && propList[i] === value) {
return true;
}
}
return false;
};
var clone = function(o) {
var copy = {};
for (prop in o) if (!contains(prop)) {
copy[prop] = o[prop];
}
return copy;
};
if (!(!!document.attachEvent) && !Object.prototype.hasOwnProperty("parent")) {
Object.prototype.parent = function() { return this.__proto__; };
}
child = clone(this);
// for IE
if (!!document.attachEvent) {
for (var i = 0, len = obj.length; i < len; i++) {
var o = obj[i];
for (prop in o) if (!contains(prop)) {
child[prop] = o[prop];
}
}
}
// for Modern Browsers
else {
for (var i = 0, len = obj.length; i < len; i++) {
var parent = {};
var o = obj[i];
for (var prop in o) if (!contains(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 d = 1; d <= depth; d++) {
plist[d] = "__proto__";
};
eval(plist.join(".") + " = parent");
}
}
return child;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment