Created
May 17, 2011 02:52
-
-
Save mapserver2007/975811 to your computer and use it in GitHub Desktop.
プロトタイプベースOOP試作その1
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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