gpt4 book ai didi

javascript - 如何更改 javascript 属性调用的范围/上下文?

转载 作者:行者123 更新时间:2023-11-28 07:32:53 24 4
gpt4 key购买 nike

我认为用一个简单的例子来解释我的问题是最简单的。

想象一下,存在一个简单的 Javascript 类层次结构,涉及 Shape 和 Square 类,其中 Square “继承”自 Shape。此外,在这种情况下,Shape 有一个名为“colour”的属性(在 Shape 原型(prototype)上使用 Object.defineProperty 创建的实际属性)和一个名为“draw”的函数。此外,在此示例中,Shape 类有一个名为“alpha”的成员变量,该变量在 Shape 构造函数中初始化。还假设 Shape 构造函数是通过 Square 构造函数调用的。

假设在这种情况下Shape的绘制函数定义为:

Shape.prototype.draw = function(canvas) {
alpha = 52;
// do some stuff
};

然后覆盖 Square 并调用父(Shape)绘制函数就很简单了:

Square.prototype.draw = function(canvas) {

// Do some stuff here

Shape.prototype.draw.call(this, canvas);
};

但是,我似乎无法弄清楚如何对“颜色”属性执行相同的操作,因为我无法弄清楚如何更改 Square 实例的 setter 调用的范围/上下文(即“这')。例如,如果我尝试:

Object.defineProperty(Square.prototype, "colour", {
set : function(value) {
// Do some stuff
Shape.prototype.colour = 55;
}
});

如果 Shape 的颜色设置方法尝试访问“alpha”,那么这当然会失败,因为“alpha”是在 Square 对象实例中定义的,而不是在 Shape 原型(prototype)中定义的。理想情况下,我希望能够做这样的事情:

Object.defineProperty(Square.prototype, "colour", {
set : function(value) {
// Do some stuff

// Imagine that 'call_set' is a function like call, only for property setters.
Shape.prototype.colour.call_set(this, 55);

}
});

不幸的是,据我所知,没有像“call_set”这样的JS方法。

是否可以使用任意范围调用属性 getter/setter?

假设在此示例中 Shape 的实现是“一成不变的”并且无法更改。因此,不幸的是,诸如“不使用属性”之类的答案无法解决此问题。

最佳答案

好的,所以我找到了这个问题的答案,并认为我应该发布它,以防其他人遇到问题。

所以我想出的解决方案是这样的:

Object.defineProperty(Square.prototype, "colour", {
set : function(value) {
// Do some stuff
var parentProp = Object.getOwnPropertyDescriptor(Shape.prototype, "colour");
parentProp.set.call(this, value);
}
});

解决问题的关键在于了解如何访问属性的“get”和“set”方法。如果有人有更好或更 Eloquent 解决方案,请分享:)

关于javascript - 如何更改 javascript 属性调用的范围/上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28923461/

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