Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我们不能在不调用子类中的超级构造函数的情况下访问超类属性?_Javascript_Prototype_Prototypal Inheritance - Fatal编程技术网

Javascript 为什么我们不能在不调用子类中的超级构造函数的情况下访问超类属性?

Javascript 为什么我们不能在不调用子类中的超级构造函数的情况下访问超类属性?,javascript,prototype,prototypal-inheritance,Javascript,Prototype,Prototypal Inheritance,为什么我们不能在不调用子类中的超级构造函数的情况下访问超类属性 // Shape - superclass function Shape() { this.x = 10; this.y = 20; } // Rectangle - subclass function Rectangle() { // Shape.call(this); } // subclass extends superclass // inheritance part code Rectangle.

为什么我们不能在不调用子类中的超级构造函数的情况下访问超类属性

// 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
如果我在子类中调用超级构造函数,我可以使用子类对象访问超级类属性,而无需编写继承代码部分,那么这是否意味着我们不需要编写实现继承的代码,只需调用超级类构造函数就足够了?但我观察到在这种情况下,子类object rect不被认为是形状的实例,所以我们没有实现继承,不是吗

// 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
建造师 你看,你在那里做的并不是真正的课堂。您制作了一个函数形状和另一个函数矩形。如果希望两个函数都初始化对象,则必须确保它们都被调用。您甚至可以在同一对象上调用更多构造函数

JavaScript中构造函数的实际作用:当使用新操作符调用函数时,该函数中的this将是一个新对象,this.prototype将与该函数的prototype相同。该对象也将在调用结束时返回。看,它与其他语言中的构造函数不同

遗产 在完全不同的代码段中,您将Shape.prototype指定给Rectangle.prototype。这只意味着,如果在矩形实例或矩形.prototype中找不到属性,Shape.prototype将成为搜索的原型链中的下一个


原型的工作原理是:您需要一个名为myObject.x的值。如果myObject没有这样的属性,那么将返回myObject.prototype.x。如果不存在,将返回myObject.prototype.prototype.x。依此类推,直到它到达Object.prototype。您还可以使用来区分真正是对象属性的属性和继承属性。

如果超类构造函数中的代码没有运行,如何初始化属性?