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

Javascript prototype inheritance and Object Constructor

本文关键字:对象 构造函数 继承 原型 Javascript      更新时间:2023-09-26

我有以下一段用于学习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基本上都是Object constructor而不是CircleArea构造函数,但是当我在alert函数中调用CalArea.area()时,this.x获取7作为其值,而值7作为参数传递给CircleArea构造函数,而不是传递给CalArea.constructor和CircleArea.prototype构造函数现在引用的对象构造函数。

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

CircleArea 的实例上调用area()

area()使用this.x .

this 在这种情况下,您的CircleArea实例具有x=7

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

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


我猜您的混淆源于this设置为调用函数的对象实例,因此调用CalArea.area()意味着this设置为CalArea因此this.xCalArea.x相同

当你将一个对象分配给原型(CircleArea.prototype = {area: fun..})时,你只需调度默认的CircleArea.prototype,因此CircleArea.prototype.constructor也被调度。但是当你使用运算符new时,CircleArea仍然是构造函数,它返回CircleArea的对象实例({x:参数,proto:{ area:fun,proto:...}})。你不能使用新的CalArea.constructor(),但可以新建CircleArea()。new CalArea.constructor() 返回 Object 实例