我正在研究从父对象继承到子对象的方法对变量的可访问性。
执行继承将父实例与子构造函数的原型相关联:
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
变量?
答案 0 :(得分:3)
父“getName()”函数中的变量“self”指的是父实例。子节点中的“init”函数在该对象上设置名称,而不是原型对象。
因此:
var baby = new Baby("Jimmy");
会将“name”属性设置为字符串“Jimmy”的对象baby.getName();
调用原型对象上的函数,因为“baby”对象上没有“getName”属性。在该函数内部,引用变量“self”,它指的是对象“baby”的原型对象 - 不。原型对象上没有设置“name”属性。如果您更改原型中的.getName()
功能以使用this.name
而不是self.name
,会发生什么情况。