I have an instance from Square which inherits from Rectangle
instance instanceof Rectangle --> true
instance instanceof Square --> true
instance.area() ; // --> area is defined by Rectangle
Now, in my code I don't know where the 'area' function is defined and I want the prototype object which defines it. Of course I can traverse the prototype chain (not tested)
var proto = instance ;
while( !(proto = Object.getPrototypeOf(proto)).hasOwnProperty('area') ) {}
// do something with 'proto'
However, I was wondering if there is a better/faster way to get the prototype object to which a function belongs ?
No. There isn't. You have to traverse the prototype chain:
function owner(obj, prop) {
var hasOwnProperty = Object.prototype.hasOwnProperty;
while (obj && !hasOwnProperty.call(obj, prop))
obj = Object.getPrototypeOf(obj);
return obj;
}
Now you simply do:
var obj = owner(instance, "area");
console.log(obj === Rectangle); // true
If instance
or its prototypes do not have the property area
then owner
returns null
.
Replying to you comment: What you essentially seem to want is to call a function of the base class inside the overriding function of an inherited class.
I wouldn't bother with the prototype chain in your case, you can just build base
into your inheritance model:
function Rectangle() {}
Rectangle.prototype.area = function () {
console.log("rectangle");
};
//setting up inheritance
function Square() {}
Square.prototype = Object.create(Rectangle.prototype);
Square.prototype.base = Rectangle.prototype;
Square.prototype.area = function () {
this.base.area();
console.log("square");
};
var square = new Square();
square.area();
FIDDLE