gpt4 book ai didi

javascript - 从 JavaScript 继承方法访问变量

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:05:30 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

因此:

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

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

关于javascript - 从 JavaScript 继承方法访问变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9294791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com