1

我在Dojo中找到了以下示例:权威指南:

function Shape(centerX, centerY, color)
{
  this.centerX = centerX;
  this.centerY = centerY;
  this.color = color;
};

function Circle(centerX, centerY, color, radius)
{

  this.base = Shape;
  this.base(centerX, centerY, color);
  this.radius = radius;
};

c = new Circle(10, 20, "blue", 2);

请解释这个例子是如何工作的。我知道当我们调用构造函数 Circle 时,this指的是正在创建的对象,所以我很清楚为什么c对象具有baseradius属性,但是它是如何得到centerXcenterY,,,color

4

4 回答 4

3

因为您已将Shape函数分配给this,然后通过执行调用它this.base()

所以在这里,base方法就是Shape函数,当你这样做时, inobj.method()的值被设置为。因此in的值是您的新对象。thismethodobjthisShapeCircle


更常见的方法是使用.call()而不是将函数设置到对象上。

Shape.call(this, centerX, centerY, color);

这将调用该Shape函数,并将其this值设置为您作为第一个参数提供的任何值。传递给的其余参数.call()只是作为常规参数传递给Shape.


我猜他们this.base = Shape之所以使用,是因为代码中的其他地方还有其他用途this.base

于 2013-06-25T14:24:50.817 回答
2

Circle得到一个新base属性,它解析为名为的函数Shape

this.base = Shape;

然后,调用该函数并传递centerXcenterYcolor参数。由于您的this对象永远不会改变,centerX并且朋友被分配给稍后获得属性的同一个对象radius

this.base(centerX, centerY, color);
this.radius = radius;
于 2013-06-25T14:25:07.273 回答
2

在 JavaScript 中,函数也是对象。Shape是用于向 中添加方法和属性的函数,操作员this可以使用它new来制作Shape对象。它也可以被 Circle 调用来为 . 所创建的对象添加方法和属性Circle

而不是分配base你可以这样做:

function Circle(centerX, centerY, color, radius)
{
  Shape.call(this, centerX, centerY, color);
  this.radius = radius;
};
于 2013-06-25T14:32:47.077 回答
1

它与上下文有关this,如果我调用 window.dosomething() 而不是thisin dosomethingis window。如果我this.base从新创建的 c 实例调用而不是this.... 要创建的 c 实例。

this.base 恰好是 Shape 所以当它被执行时this上下文是......(你猜对了;它是要创建的 Circle)。

Shape 的第一行是:

this.centerX = centerX;

现在,如果您还记得this所指的内容,现在可能会添加 centerX 属性。

这种继承不使用原型,所以console.log(c instanceof Shape)是错误的,Shape 的原型上的任何内容都不是 Circle 的一部分。

对于原型继承,您可以阅读以下内容:原型继承 - 编写(只是基础)

于 2013-06-25T14:31:49.633 回答