[removed] find the prototype object to which a property belongs

前端 未结 2 1465
清酒与你
清酒与你 2021-01-06 06:21

I have an instance from Square which inherits from Rectangle

instance instanceof Rectangle --> true
instance instanceof Square    --> true
instance.are         


        
相关标签:
2条回答
  • 2021-01-06 06:52

    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.

    0 讨论(0)
  • 2021-01-06 07:05

    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

    0 讨论(0)
提交回复
热议问题