【问题标题】:In JavaScript, how can you access a property of a superclass' instance?在 JavaScript 中,如何访问超类实例的属性?
【发布时间】:2015-08-16 21:27:33
【问题描述】:

在 JavaScript 中,如何访问超类实例的属性?例如,我希望将超类实例的“prop”设置为“true”,但此代码创建并将子类实例的“prop”设置为“true”,而留下超类实例的“prop” " 为假:

var SuperClass = function() {
    this.prop = true;
}

SuperClass.prototype.doStuff = function() { 
    if (this.prop) {
        console.log('SuperClass does A.');
    }
    else {
        console.log('SuperClass does B.');
    }
}

SuperClass.prototype.load = function() {
    this.prop = false;
}

SuperClass.prototype.setProp = function(val) {
    this.prop = val;
}

function SubClass() {
    SuperClass.call(this);
}

SubClass.prototype = Object.create(SuperClass.prototype);
SubClass.prototype.constructor = SubClass;

SubClass.prototype.doStuff = function() {
    SuperClass.prototype.doStuff();

    if (this.prop) {
        console.log('SubClass does A.');
    }
    else {
        console.log('SubClass does B.');
    }
}

SubClass.prototype.load = function() {
    SuperClass.prototype.load();
}

var anObject = new SubClass();
anObject.load();
anObject.setProp(true);
anObject.doStuff();

目前,输出是“SuperClass does B. SubClass does A.”,这不是预期的结果。如何正确设置“prop”的值,以便它们都执行“A”?我不想在子类的实例中创建新属性,我想访问超类实例中的现有属性。

谢谢!

此外,您可以从子类的构造函数访问超类的实例的属性吗?还是需要先实例化子类?

【问题讨论】:

    标签: javascript class inheritance


    【解决方案1】:
    SubClass.prototype.doStuff = function() {
        SuperClass.prototype.doStuff();
    

    您没有为超类提供任何上下文,因此该函数没有作用于当前对象(即this 将是错误的)。

    改为尝试:

    SubClass.prototype.doStuff = function() {
        SuperClass.prototype.doStuff.call(this);
    

    这给了我想要的输出:

    SuperClass does A.
    SubClass does A.
    

    【讨论】:

    • 啊,我明白了!因此,每当我通过执行 .call(this) 调用超类的方法时,它都会首先使用子类的实例的属性,即使在超类的实例中也有同名的属性也没关系。非常感谢!
    • 对象中只有一个属性prop,父类和子类没有单独的属性。从任一原型中的函数访问this.prop 将确认这一点。您所做的是调用超类函数没有对象的范围,因此在超类方法this 内部将是全局范围,而不是您认为的对象。由于全局范围内没有propthis.prop 是未定义的,if(this.prop) 是假的,然后你点击了 else 分支。
    猜你喜欢
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 2012-03-11
    • 2013-03-10
    相关资源
    最近更新 更多