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

如何更改对javascript属性的调用的范围/上下文?,javascript,prototypal-inheritance,Javascript,Prototypal Inheritance,我认为用一个简单的例子来解释我的问题是最容易的 假设存在一个简单的Javascript类层次结构,其中涉及类Shape和Square,其中Square“继承”自Shape。此外,在这个场景中,Shape有一个名为“color”的属性(在Shape原型上使用Object.defineProperty创建的实际属性)和一个名为“draw”的函数。此外,在本例中,Shape类有一个名为“alpha”的成员变量,该变量在Shape构造函数中初始化。还假设形状构造函数是通过方形构造函数调用的 在此场景中,

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

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

在此场景中,假设形状的绘制功能定义为:

Shape.prototype.draw = function(canvas) {
   alpha = 52;
   // do some stuff
};
那么,使用Square覆盖并调用父(Shape)draw函数非常简单:

Square.prototype.draw = function(canvas) {

  // Do some stuff here

  Shape.prototype.draw.call(this, canvas);
};
但是,我似乎不知道如何对“color”属性执行相同的操作,因为我无法确定如何将对setter的调用的范围/上下文更改为Square实例(即“this”)。例如,如果我尝试:

Object.defineProperty(Square.prototype, "colour", {
    set : function(value) {
        // Do some stuff    
        Shape.prototype.colour = 55;
    }
});
如果Shape的colorsetter方法试图访问“alpha”,那么这当然会失败,因为“alpha”是在Square对象实例中定义的,而不是在Shape原型中定义的。 理想情况下,我希望能够做到以下几点:

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


在本例中,假设形状的实现是“一成不变的”,并且不能更改。所以像“不要使用属性”这样的答案很不幸不能解决这个问题。

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

所以我提出的解决方案是:

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”方法。
如果任何人有更好或更雄辩的解决方案,请分享:)

我还应该提到,在Shape的原型中设置“alpha”也不是一个选项,因为我希望在“每个实例”的基础上维护“alpha”(即,如果将其放置在Shape.prototype中,则所有Shape和Shape派生实例都将共享它)。每当您更改
正方形的颜色时,您实际上想要更改
形状
的颜色吗?@thefourtheye,当正方形被实例化时,只有一个对象的“实例”,因此我实际上希望在通过Square的属性setter设置颜色时更改正方形实例的颜色。但是,我仍然希望调用Shape的颜色设置器,因此实际上,我覆盖了“Color”属性设置器方法,但仍然调用父(Square)实现,我认为您的抽象示例可能没有准确地表达需求,而不是将
形状
定义为
颜色
。我假设形状在颜色变化时会起作用,这就是为什么你要称之为“setter”。JS中没有整洁的解决方法。只需在Shape对象setcolor和painthehouse上定义一个方法,让它同时设置属性和做一些工作。财产设定者不应该真的有副作用。