【问题标题】:Variable access from JavaScript inherited methods来自 JavaScript 继承方法的变量访问
【发布时间】:2012-03-06 21:04:02
【问题描述】:

我正在研究从父对象继承到子对象的方法对变量的可访问性。

通过将父实例关联到子构造函数的原型来执行继承:

Function.prototype.extend = function(child) {
    var prototype = new this;

    child.prototype = prototype;
    return child;
};

所以我定义了一个父类:

var Parent = function() {
    var self = this;

    this.init = function() {
        self.name = 'Abram';
    };
    this.getName = function() {
        alert('self.name = ' + self.name);
    };
    this.init();
};

还有一个子类:

var Baby = Parent.extend(function(name) {
    var self = this;

    this.init = function() {
        self.name = name;
    };
    this.init();
});

// instantiate a child object:
var baby = new Baby('Jimmy');

// call the inherited method:
baby.getName(); // undefined!

方法getName被正确继承,但它无权访问self.name成员。
怎么可能,在子类实例的范围内可用呢?

alert(baby.getName)检查方法的主体我得到:

function () {
    alert("self.name = " + self.name);
}

这正是我所期望的。
但是为什么它不能在本地解析self 变量呢?

【问题讨论】:

    标签: javascript oop inheritance scope


    【解决方案1】:

    父“getName()”函数中的变量“self”指的是实例。子对象中的“init”函数设置该对象的名称,而不是原型对象。

    因此:

    1. var baby = new Baby("Jimmy"); 导致对象的“名称”属性设置为字符串“Jimmy”
    2. baby.getName(); 调用原型对象上的函数,因为“婴儿”对象上没有“getName”属性。在该函数内部,对变量“self”进行了引用,该变量引用了该原型对象——不是对象“baby”。原型对象上没有设置“名称”属性。

    看看如果您将原型中的.getName() 函数更改为使用this.name 而不是self.name 会发生什么。

    【讨论】:

    • 感谢@Pointy,我已经尝试将 self.name 更改为 this.name 并且它可以工作(在那个级别,还没有关闭),但是本地命名的成员正是我想要的好处喜欢利用自己进行有效的代码重用,例如在嵌套函数范围内使用它们。
    • 那么问题是你的“父”函数中的“自我”的绑定将永远是原始对象实例;由于关闭,它“卡住”了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 2020-04-24
    • 2012-02-04
    • 1970-01-01
    相关资源
    最近更新 更多