Javascript Inheritance From Multiple Objects
I'm not very well aquainted with javascript inheritance, and I'm trying to make one object inherit from another, and define its own methods: function Foo() {} Foo.prototype = {
Solution 1:
Each object can only have one prototype, so if you want to add to the prototype after inheriting (copying) it, you have to expand it instead of assigning a new prototype. Example:
functionFoo() {}
Foo.prototype = {
x: function(){ alert('x'); },
y: function(){ alert('y'); }
};
functionFoo2() {}
Foo2.prototype = newFoo();
Foo2.prototype.z = function() { alert('z'); };
var a = newFoo();
a.x();
a.y();
var b = newFoo2();
b.x();
b.y();
b.z();
Solution 2:
One solution would be:
functionFooB() {}
var p = newFoo();
p.methodA = function(){...}
p.methodB = function(){...}
p.methodC = function(){...}
...
FooB.prototype = p;
Update: Regarding expanding with an existing object. You can always copy the existing properties of one object to another one:
FooB.prototype = newFoo();
var proto = {
/*...*/
};
for(var prop in proto) {
FooB.prototype[prop] = proto[prop];
}
As long as proto
is a "plain" object (i.e. that does not inherit from another object) it is fine. Otherwise you might want to add if(proto.hasOwnProperty(prop))
to only add non-inherited properties.
Solution 3:
You can use an extend
function which copies the new members to the prototype object.
functionFooB() {}
FooB.prototype = newFooA();
extend(FooB.prototype, {
/* other methods here */
});
extend
/**
* Copies members from an object to another object.
* @param {Object} target the object to be copied onto
* @param {Object} source the object to copy from
* @param {Boolean} deep whether the copy is deep or shallow
*/functionextend(target, source, deep) {
for (var i in source) {
if (deep || Object.hasOwnProperty.call(source, i)) {
target[i] = source[i];
}
}
return target;
}
Post a Comment for "Javascript Inheritance From Multiple Objects"