gpt4 book ai didi

javascript - 自定义类的未定义属性

转载 作者:行者123 更新时间:2023-11-28 18:04:16 28 4
gpt4 key购买 nike

假设我有课 AB 。类 B有一个成员,它是类 A 的实例,我们称之为this.a .

进入时B我尝试访问 A 的方法的方法为 this.a.<methodName> ,我收到以下错误:

TypeError: this.a is undefined

这是我的代码:

function A (name) {
this.name = name;
}
A.prototype.foo = function () {
this.name = this.name.toUpperCase();
};
A.prototype.bar = function () {
this.name = this.name.toLowerCase();
};

function B () {
this.a = new A('Hello, World!');
}
B.prototype.methodsOfA = {
foo: this.a.foo, // here is the problem
bar: this.a.bar //
};
B.prototype.executeMethodOfA = function (methodName) {
this.methodsOfA[methodName]();
//the following works if I delete B.prototype.methodsOfA:
//if (methodName.toLowerCase() === 'foo') this.a.foo();
//else if (methodName.toLowerCase() === 'bar') this.a.bar(); //
};

b = new B();

console.log(b.a.name);
b.executeMethodOfA('foo');
console.log(b.a.name);
b.executeMethodOfA('bar');
console.log(b.a.name);

相反,如果我使用以下定义:

B.prototype.methodsOfA = {
foo: A.prototype.foo,
bar: A.prototype.bar
};

我收到以下错误:

TypeError: this.name is undefined

(可能是因为 this 在本例中是 b 并且 B 对象没有 name 属性。)

那么,我如何访问 this.a.<methodName>从里面B

注意:这是一个较大问题的简化版本。我知道我问的问题可以通过类/原型(prototype)继承来解决,但理想情况下我想要 B 继承自A .

最佳答案

我的直觉告诉我有更好的方法来解决这个问题,但现在这里有一些工作代码..

function A (name) {
this.name = name;
}
A.prototype.foo = function () {
this.name = this.name.toUpperCase();
};
A.prototype.bar = function () {
this.name = this.name.toLowerCase();
};

function B () {
this.a = new A('Hello, World!');
}
B.prototype.methodsOfA = function (methodName) {
var methods = {
foo: this.a.foo.bind(this.a),
bar: this.a.bar.bind(this.a),
}
return methods[methodName];
};
B.prototype.executeMethodOfA = function (methodName) {
this.methodsOfA(methodName)();
};
b = new B();

console.log(b.a.name);
b.executeMethodOfA('foo');
console.log(b.a.name);
b.executeMethodOfA('bar');
console.log(b.a.name);

您有两个问题:

    对象上下文中的
  • this 并不引用您正在考虑的 this。它指的是窗口,因为 methodsOfA 作为普通对象,不会用 this 注入(inject)。我将其更改为正确的方法,现在 this 就是您想要的 this
  • 您需要将 A 方法绑定(bind)到 A 本身的本地实例。这是因为只有在以 a.foo() 样式调用时,方法才会被赋予预期的 this 指针。将 a.foo 分配给另一个名称并调用它(如您所做的那样)将丢失 this 上下文。您可以使用 bind() 强制使用正确的上下文,如上所示。

关于javascript - 自定义类的未定义属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43008658/

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