为什么不在子类中调用超级构造函数就不能访问超级类属性?

时间:2018-07-21 14:36:09

标签: javascript prototype prototypal-inheritance

  1. 为什么不在子类中调用超级构造函数就不能访问超级类属性?

    // Shape - superclass
    function Shape() {
        this.x = 10;
        this.y = 20;
    }
    // Rectangle - subclass
    function Rectangle() {
        // Shape.call(this);
    }
    
    // subclass extends superclass
    // inheritance part code
    Rectangle.prototype = Object.create(Shape.prototype);
    Rectangle.prototype.constructor = Rectangle;
    
    var rect = new Rectangle();
    
    console.log( rect instanceof Shape);    // true
    console.log(rect.x);    // undefined
    console.log(rect.y);    // undefined
    
  2. 如果我在子类中调用Super Constructor,则可以在不编写继承代码部分的情况下使用子类对象访问父类属性,这是否意味着我们不需要为调用继承而编写该代码即可实现继承构造函数够了吗?但是在这种情况下,我观​​察到子类对象rect不被认为是instanceof Shape,所以我们没有实现继承,不是吗?

    // Shape - superclass
    function Shape() {
        this.x = 10;
        this.y = 20;
    }
    // Rectangle - subclass
    function Rectangle() {
        Shape.call(this);
    }
    
    // subclass extends superclass
    // inheritance part code
    // Rectangle.prototype = Object.create(Shape.prototype);
    // Rectangle.prototype.constructor = Rectangle;
    
    var rect = new Rectangle();
    
    console.log( rect instanceof Shape);    // false
    console.log(rect.x);    // 10
    console.log(rect.y);    // 20
    

1 个答案:

答案 0 :(得分:0)

构造函数

您看到的是,您在这里所做的并不是一个真正的课程。您创建了一个函数Shape和另一个函数Rectangle。如果要两个函数都初始化您的对象,则必须确保它们都被调用了。您甚至可以在同一对象上调用更多构造函数。

JavaScript中的构造函数的实际作用:当使用function运算符调用new时,this中的function将是新的Object和{ {1}}与该函数的this.prototype相同。该对象还将在调用结束时返回。因此,它与其他语言的构造器不同。

“继承”

在完全不同的代码段中,您将prototype分配给Shape.prototype。这仅意味着,如果在Rectangle.prototype实例或Shape.prototype中找不到属性,则Rectangle将在搜索的原型链中排在下。

原型的工作方式是:您想要一个名为Rectangle.prototype的值。如果myObject.x没有这种属性,将返回myObject。如果不存在,将返回myObject.prototype.x。依此类推,直到达到myObject.prototype.prototype.x。您还可以使用Object.prototype.hasOwnProperty区分实际上是对象的属性和继承的属性。