2013-06-25 4 views
1

я нашел следующий пример Dojo: The Definitive Guide:Вызов конструктора в другой конструктор

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 и свойства, но как это получить centerX, centerY, color?

ответ

3

Поскольку вы назначили функцию Shape на this, а затем вызвали ее, выполнив this.base().

Так вот, метод base является Shape функция, и когда вы obj.method() значение this в method устанавливается в obj. Поэтому значение this в Shape - ваш новый объект Circle.


Более распространенным подходом является использование .call() вместо установки функции на объект.

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

Это вызывает Shape функции с ее this значения, установленного на то, что вы предоставили в качестве первого аргумента. Остальные аргументы, переданные в .call(), просто передаются как обычные аргументы Shape.


Я предполагаю, что они использовали this.base = Shape, потому что есть некоторые другие использовать для this.base в других местах в коде.

+0

Параметр 'base' трюк для реализации что-то, что выглядит как иерархии объектов, не манипулировать прототип – SheetJS

2

ваш Circle получает новое base свойство, которое разрешает функцию с именем Shape:

this.base = Shape; 

Затем эта функция вызывается и прошла centerX, centerY и color параметров. Так как ваш this объект никогда не меняется, centerX и друзей назначены на тот же объект, который позже получает в radius свойство:

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

Это связано с контекстом из this, если я называю window.dosomething(), чем this в dosomething - это окно. Если я вызываю this.base из только что созданного экземпляра c, то this является ... созданным экземпляром c.

это.база бывает форма, поэтому, когда она выполнена, контекст this ... (вы догадались, это созданный круг).

Первая линия Shape является:

this.centerX = centerX; 

Теперь, если вы помните, что this называется вы можете теперь, где будет добавлено свойство CenterX.

Этот тип наследования не использует прототип, поэтому console.log(c instanceof Shape) является ложным, а anyting на прототипе Shape не является частью Circle.

Для наследования прототипа вы можете прочитать следующее: Prototypical inheritance - writing up (только основы)

2

В JavaScript функции также являются объектами. Shape - функция для добавления методов и свойств к this, которые могут использоваться оператором new для создания объектов Shape. Он также может быть вызван Circle для добавления методов и свойств к объекту, создаваемому Circle.

Вместо назначения base вы могли бы сделать:

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