0

这是我的小程序。当我在调试模式下检查 rec 的值时,对象是 Base { x=0, y=0, w=10, more...}。应该是矩形吗?此外,constructor.prototype 是 Base。为什么不是形状?

    function Base() {
    }

    function Shape(x, y) {
        this.x = x;
        this.y = y;
    }

    Shape.prototype = new Base();
    Shape.prototype.move = function(x, y) {
        this.x += x;
        this.y += y;
        console.log("x = " + this.x + " y = " + this.y);
    };

    function Rectangle(x, y, w, h) {
        Shape.call(this, x, y);
        this.w = w;
        this.h = h;
    }

    Rectangle.prototype = new Shape();
    Rectangle.prototype.area = function() {
        return this.w * this.h;
    };
    var rec = new Rectangle(0, 0, 10, 10);
    console.log(instanceOf(rec, Rectangle));

    function instanceOf(object, constructor) { 
        while (object != null) {
            if (object == constructor.prototype)
                return true;
            if ( typeof object == 'xml') {
                return constructor.prototype == XML.prototype;
            }
            object = object.__proto__;
        }
        return false;
    }
4

1 回答 1

0

看看为什么[不]在这里使用new关键字?. 您可能不会使用它并创建它的新实例,而只是从Base.prototype.

此外,constructor.prototype 是 Base。为什么不是形状?

我不确定constructor你在这里指的是哪个:

  • 所有对象的constructor属性都是Base,因为它们都从Base.prototype对象继承了这个原型。设置继承链后您没有覆盖它。这不是真正必要的,但很好的风格:Shape.prototype.constructor = ShapeRectangle.prototype.constructor = Rectangle- 那些原型对象是继承自Base.

  • 你的函数的constructor参数。instanceOf你传入Rectangle那里,constructor.prototype它的原型对象也是如此Rectangle,它继承Base但不同。

当我在调试模式下检查 rec 的值时,对象是 Base { x=0, y=0, w=10, more...}

通常不会。有Base什么特别的吗,例如宿主对象?您的rec对象是 的一个实例Base,因此它可能会因此而以不同的方式显示。

rec只是一个继承自Rectangle.prototype哪个继承自Shape.prototype哪个继承自Base.prototype哪个继承自的对象......假设Base是您定义的函数Object.prototype,继承自null

于 2012-11-11T12:05:15.060 回答