Javascript原型继承和对象构造函数

Javascript原型继承和对象构造函数,javascript,Javascript,我有下面一段学习JS的代码 function CircleArea(x) { this.x = x; } CircleArea.prototype = { area: function () { return 22 / 7 * this.x * this.x; } }; var CalArea = new CircleArea(7); if( CalArea.constructor === CircleArea.prototype.constructor

我有下面一段学习JS的代码

function CircleArea(x)
{
   this.x = x;
}

CircleArea.prototype = 
{  
   area: function () {
       return 22 / 7 * this.x * this.x;
   }
};

var CalArea = new CircleArea(7);
if( CalArea.constructor === CircleArea.prototype.constructor)
{
   alert(CalArea.area());
}

我通过向CircleArea.prototype分配一个对象文字来解耦继承链,然后使用CircleArea构造函数定义CalArea对象。现在,CalArea.constructor和CircleArea.prototype.constructor基本上都是对象构造函数,而不是CircleArea构造函数,但是当我调用CalArea.area内部警报函数时,这个.x获得7作为其值,而值7作为参数传递给CircleArea构造函数,而不是传递给CalArea.constructor和CircleArea.prototype构造函数现在引用。

我不确定你所说的解耦继承链是什么意思,但对我来说,你所经历的是预期的行为

在CircleArea实例上调用area

区域使用这个.x

在该上下文中,这是具有x=7的CircleArea实例

所以你的计算是22/7*7*7

如果你期待的是不同的东西,你能解释一下你期待的是什么以及你为什么期待它吗


我猜您的困惑源于此,它被设置为调用函数的对象实例,因此调用CalArea.area意味着它被设置为CalArea,因此当您将对象分配给prototype CircleArea时,this.x与CalArea.x相同。prototype={area:fun..}您只需分派默认的CircleArea.prototype,因此也分派了CircleArea.prototype.constructor。但CircleArea仍然是构造函数,当您使用运算符new时,它返回CircleArea{x:argument,proto:{area:fun,proto:…}的对象实例。
您不能使用新的CalArea.constructor,但可以使用新的CircleArea。new CalArea.constructor返回对象实例

相关:您的问题是什么?问题是CalArea构造函数和CircleArea原型构造函数何时引用对象构造函数CalArea对象上的调用区域方法如何获得此值。x=7。尽管值7传递给CircleArea构造函数而不是对象构造函数?@user2913184所使用的构造函数仍然是CircleArea,因为无论构造函数属性的值如何,这都是提供给新操作符的。该属性与实例的创建方式无关。这只是为了提供信息。哇,我已经有一段时间没有看到22/7用于PI了,特别是考虑到JavaScript,我有点知道你的观点,但我的困惑是,当CalArea.constructor是一个对象构造函数而不是CircleArea构造函数时,为什么传递给CircleArea构造函数的参数会向一个构造函数不是Object的对象CalArea提供值CircleArea@user2913184:我建议你去CircleArea.prototype.constructor=函数Foo{},在创建CalArea之后,请查看CalArea.constructor。根据你的逻辑,CalArea应该由Foo建造,但我们都知道事实并非如此。CalArea.constructor只是指CircleArea.prototype.constructor,该值在对象本身的构造中不起作用。因此,您的意思是,尽管CalArea构造函数将是Foo构造函数,但它实际上在CalArea itslef的构造中不起作用。我说的对吗,先生?我还看到,如果我分配一个属性,比如CircleArea.prototype.area=function{},然后定义CalArea,现在CalArea和CircleArea.prototype.constructor都将引用CircleArea构造函数,但是CalArea.area将返回一个圆圈面积的数字,circlearearea.prototype.area将返回NaN。我猜虽然CircleArea是CalArea和CircleArea.prototype的构造函数,但只有CalArea是它的实例而不是CircleArea.prototype,因此面积是为CalArea而不是CircleArea.prototype计算的。