Skip to content

Instantly share code, notes, and snippets.

@mapserver2007
Created May 13, 2011 07:39
Show Gist options
  • Save mapserver2007/970152 to your computer and use it in GitHub Desktop.
Save mapserver2007/970152 to your computer and use it in GitHub Desktop.
親子関係を維持したオブジェクト継承サンプル
<html>
<head>
<script>
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.prototype.parent = function() { return this.__proto__; };
// 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;
};
function start() {
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);
if (!!document.attachEvent) {
var _d = document.getElementById("forie");
var children = _d.childNodes;
var j = 0;
for (var i = 0, len = children.length; i < len; i++) {
if (children[i].id) {
switch (j) {
case 0:
document.getElementById("o5").innerHTML = o1.getPhoneName();
break;
case 1:
try {
document.getElementById("o6").innerHTML = o1.parent().getPhoneName();
} catch (e) {
document.getElementById("o6").innerHTML = e;
}
break;
case 2:
try {
document.getElementById("o7").innerHTML = o1.parent().getPhoneName();
} catch (e) {
document.getElementById("o7").innerHTML = e;
}
break;
case 3:
document.getElementById("o8").innerHTML = o1.getType();
break;
}
j++;
}
}
}
else {
document.getElementById("o1").innerHTML = o1.getPhoneName();
document.getElementById("o2").innerHTML = o1.parent().getPhoneName();
document.getElementById("o3").innerHTML = o1.parent().parent().getPhoneName();
document.getElementById("o4").innerHTML = o1.getType();
}
}
</script>
</head>
<body onload="start();">
<h1>for modern browsers</h1>
<div id="formodern">
o1.getPhoneName(): <span id="o1"></span>
<br>
o1.parent().getPhoneName(): <span id="o2"></span>
<br>
o1.parent().parent().getPhoneName(): <span id="o3"></span>
<br>
o1.getType(): <span id="o4"></span>
</div>
<h1>for IE</h1>
<div id="forie">
o1.getPhoneName(): <span id="o5"></span>
<br>
o1.parent().getPhoneName(): <span id="o6"></span>
<br>
o1.parent().parent().getPhoneName(): <span id="o7"></span>
<br>
o1.getType(): <span id="o8"></span>
</div>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment