JavaScript继承方法的变量访问

时间:2012-02-15 14:01:32

标签: javascript oop inheritance scope

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

执行继承将父实例与子构造函数的原型相关联:

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变量?

1 个答案:

答案 0 :(得分:3)

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

因此:

  1. var baby = new Baby("Jimmy");会将“name”属性设置为字符串“Jimmy”的对象
  2. baby.getName();调用原型对象上的函数,因为“baby”对象上没有“getName”属性。在该函数内部,引用变量“self”,它指的是对象“baby”的原型对象 - 。原型对象上没有设置“name”属性。
  3. 如果您更改原型中的.getName()功能以使用this.name而不是self.name,会发生什么情况。