javascrptコード多重の継承
2969 ワード
参考資料:
「JavaScriptモード」(<)
中国電力出版社です.Styan Stefanov著、陳新訳.
1.原型継承
2.属性のコピーによる継承が可能です.
2.1レプリカ
「JavaScriptモード」(<
中国電力出版社です.Styan Stefanov著、陳新訳.
1.原型継承
var Main = {};
/**
prototypal inheitance.
*/
Main.createObj = function(o){
function F() {};
F.prototype = o;
return new F();
};
function Person(pName){
this.name = pName || "Adam";
};
Person.prototype.getName = function() {
return this.name;
};
Person.prototype.color = "red";
Main.testPrototypal = function(o){
var papa = new Person();
var kid = Main.createObj(papa);
console.info(kid.getName());
console.info("kid-name:" + kid.hasOwnProperty("name"));
console.info("kid-color:" + kid.hasOwnProperty("color"));
console.info("kid-getName:" + kid.hasOwnProperty("getName"));
console.info("papa-name:" + papa.hasOwnProperty("name"));// papa-name:true
console.info("papa-color:" + papa.hasOwnProperty("color"));
console.info("papa-getName:" + papa.hasOwnProperty("getName"));
};
2.属性のコピーによる継承が可能です.
2.1レプリカ
/**
-- (shallow copy)
!!
*/
Main.extend = function(parent, child) {
var i;
child = child || {};
for (i in parent) {
if (parent.hasOwnProperty(i)) {
child[i] = parent[i];
}
}
return child;
};
/**
*/
Main.testShallowCopy = function(){
console.info(" >>> Main.testShallowCopy");
var Car = {
doors: [1,2,3,4],
energy: {price: "$2.00"}
};
var oneCar = Main.extend(Car);
// !!
oneCar.doors.push(9);
// oneCar.doors, 1,2,3,4,9
console.info("oneCar.doors, " + oneCar.doors.toString());
// Car.doors, 1,2,3,4,9
console.info("Car.doors, " + Car.doors.toString());
};
2.2深さコピー /**
-- (deep copy)
*/
Main.extendDeep = function(parent, child) {
var i,
toStr = Object.prototype.toString,
astr = "[object Array]";
child = child || {};
for(i in parent) {
if(parent.hasOwnProperty(i)){
if(typeof parent[i] === "object"){
child[i] = (toStr.call(parent[i]) === astr) ? []:{};
Main.extendDeep(parent[i], child[i]);
}else{
child[i] = parent[i];
}
}
}
return child;
};
/**
*/
Main.testDeepCopy = function(){
console.info(" >>> Main.testDeepCopy");
var Car = {
doors: [5,6,7,8],
energy: {price: "$2.00"}
};
var oneCar = Main.extendDeep(Car);
// !!
oneCar.doors.push(1);
// oneCar.doors, 5,6,7,8,1
console.info("oneCar.doors, " + oneCar.doors.toString());
// Car.doors, 5,6,7,8
console.info("Car.doors, " + Car.doors.toString());
};