Javascript 与所有派生子级共享父属性值

Javascript 与所有派生子级共享父属性值,javascript,inheritance,prototype,Javascript,Inheritance,Prototype,假设有一个父类形状和一个子类矩形。我想在子类中重用父类属性的值 我是否可以在不在子类中重新初始化它的情况下执行此操作(使用call或apply) 我希望所有子对象使用相同的父属性值 //父对象 函数形状(ctx){ this.context=ctx; } Shape.prototype.getContext=function(){返回this.context;}; //子矩形从形状继承 函数矩形(x、y、w、h){ 这个.x=x; 这个。y=y; 这个.w=w; 这个,h=h; } //设置继

假设有一个父类形状和一个子类矩形。我想在子类中重用父类属性的值

我是否可以在不在子类中重新初始化它的情况下执行此操作(使用call或apply)

我希望所有子对象使用相同的父属性值

//父对象
函数形状(ctx){
this.context=ctx;
}
Shape.prototype.getContext=function(){返回this.context;};
//子矩形从形状继承
函数矩形(x、y、w、h){
这个.x=x;
这个。y=y;
这个.w=w;
这个,h=h;
}
//设置继承
Rectangle.prototype=Object.create(Shape.prototype);
Rectangle.prototype.constructor=矩形;
Rectangle.prototype.draw=函数(){
//要在此处使用继承的上下文吗
返回这个.context;
}
//创建并运行
变量形状=新形状(“值”);
var矩形=新矩形(0,0100);
//返回“值”
log(shape.getContext());
//返回未定义-需要“值”

console.log(rectangle.draw())当您执行此操作以设置矩形时,返回值为
未定义

//create and run
var shape = new Shape("value");
var rectangle = new Rectangle(0,0,100,100);
因为您实际上没有将该
形状
连接到
矩形
。您只创建了两个单独的Shape和Rectangle实例,它们除了共享某些结构之外,彼此之间没有任何关系

有一些可能的情况可以解决这个问题。在定义原型时,创建一个新的形状,以在前面播种值

//Use predefined Shape
var shape = new Shape("value");
Rectangle.prototype = shape;
现在,当使用前面显示的对
draw
的调用时,
value
将返回并记录到控制台

不过,在我看来,这并不是一个完整的场景,因为虽然您已经为上下文定义了一个getter,但在某些场景中,您可能希望更改它。我还建议为上下文实现一个setter,这样如果您愿意,就可以注入不同的setter

我是否可以在不在子类中重新初始化它的情况下执行此操作(使用call或apply)

不,没有办法给你的超级构造函数打电话

请注意,这不是重新初始化属性,调用是创建并初始化属性

我想在子类中重用父类属性的值


这真的没有道理。属性是实例的一部分,而不是类的一部分。父类没有实例如果您有多个子类,则只有子实例。如果您真的要创建父类的实例(如示例代码中所示),则该实例是一个单独的对象,与其他实例无关-大多数情况下,子对象都不是从该父实例派生的。

您的
矩形
实例不是从该
形状
实例派生的。“只有通过原型链中的公开方法才能实现这一目标“-怎么会这样?这个上下文有什么问题吗?谢谢@TravisJ我接受了你的评论并对问题进行了编辑。我试图在子对象之间共享父值,因此我认为上面的编辑可以处理它,但是现在添加您提到的setter似乎是一个问题(更改父值不会影响子对象)。@shawnmore-更改所显示的父值只会影响该实例的子对象。您需要保留父实例,以便对其进行更改,以便所有派生实例仍然只引用一个父实例。要么如此,要么将其置于此设置之外的变量中。@TravisJ在再次查看它之后,最好让所有子对象都受父对象更改的影响。我将保持父值为默认值,子值以该值开头,除非故意将其设置为其他值。谢谢@Bergi我编辑了上面的代码。现在,我正试图找到一种方法,使父setter应用于所有子对象……是的,更新后的代码似乎工作正常,为每个对象提供了一个具有相同值的属性。但是,我不明白“使父setter应用于所有子对象”是什么意思?setter始终仅在单个实例上调用。这听起来像是
上下文
根本不应该是
矩形
的属性,而是一个全局属性-可能是一个静态属性,或者是一个专用的
绘图区域
类的属性?你说得对,我刚才在setter上弄错了,根据您的评论,我在子原型中添加了一个getter和setter,如果需要的话应该对其进行更改(例如,在实例上,但对于所有其他子实例,它将默认为父值)。您指示调用超级类帮助我获得了默认值,其他评论也有帮助,因此,谢谢您,我将选择您作为答案