2012-02-17 2 views
2
class A 
    constructor: -> 
    method: -> 

В приведенном выше примере метод не связан с классом, и ни один из них не является конструктором.не может определить конструктор как связанную функцию

class B 
    constructor: -> 
    method: => 

В этом случае метод привязан к классу. Он ведет себя так, как вы ожидаете, что нормальный метод объекта ведет себя и имеет доступ ко всем полям класса B. Но конструктор не связан? Это кажется странным. Поэтому я попробовал следующее.

class C 
    constructor: => 
    method: => 

Это не скомпилировано. Я ожидаю, что синтаксис будет одинаковым во всех методах, связанных с классом.

Я хотел бы видеть оператора-оператора как оператора static и оператора => как оператора dynamic. Но это не похоже на то, что вы можете. Если бы вы могли, метод с оператором -> не мог быть вызван с супер. Но, на самом деле, вы можете. Почему это имеет смысл для синтаксиса объектно-ориентированного языка? Это, похоже, не согласуется с большинством правил наследования объектно-ориентированных языков.

ответ

4

Попробуйте посмотреть, как компилируется код. Когда вы используете =>, методы связаны внутри конструктора. Таким образом, не имеет смысла использовать => для конструктора - когда он будет связан?

Я не уверен, о проблеме с static против dynamic операторов, но вы определенно можете вызывать методы, определенные с -> оператора с super. Единственное, что -> против => влияет на то, что => гарантирует, что this является объектом, о котором идет речь, независимо от того, как он называется.

Резюме комментариев:

Вызов разницы между -> и => аналогично для статических против динамического (или виртуального) не совсем передать то, что делают эти операторы. Они используются для получения различного поведения из переменной javascript this. Например, рассмотрим следующий код:

class C 
    constructor: -> 
    method1: -> 
    console.log this 
    method2: => 
    console.log this 

c = new C() 

c.method1()  //prints c 
f = c.method1;f() //prints window 

c.method2()  //prints c 
f = c.method2;f() //prints c 

Разница во втором пути мы называем каждый метод: если метод не «привязан» к объекту, его this устанавливается смотря на то, что предшествует вызов метода (разделенный .). В первом случае это c, но во втором f не вызывается на объект, поэтому this установлено на window. method2 не имеет этой проблемы, поскольку он связан с объектом.

Как правило, вы можете думать о том, что функция-конструктор автоматически привязывается к объекту, который он создает (таким образом, вы не можете связать его с =>). Однако стоит отметить, что это не совсем то, что происходит, потому что если конструктор возвращает объект, это будет возвращаемое значение конструкции, а не this во время конструктора.

+0

То, что я подразумеваю под действием static vs dynamic, заключается в том, что статический метод нельзя переопределить, а динамический метод вы можете. Вместо динамического, может быть, я должен сказать, что виртуальный? –

+0

Я не думаю, что любое из этих понятий сопоставляет различия между '->' и '=>'. Они имеют отношение к странности в переменной 'this' этого javascript. –

+0

Я, я понимаю. но говоря о том, что язык компилируется в javascript в сторону, чтобы мы могли напрямую оценить coffeescript, эти правила синтаксиса имеют смысл? –

1

Я думаю, что вы массово запутались относительно значения «=>» или толстой стрелки.

Прежде всего, ваши примеры на самом деле не являются действительными кофейниками, не так ли? После объявления класса нет ->. Добавление одного из них - ошибка компилятора.

Назад к жирной стрелке, нет сопоставления с терминами static и dynamic, о которых я могу думать, что применимо здесь. Вместо этого жирная стрелка является удобным синтаксическим сахаром для упаковки функции с закрытием, которая содержит ссылку на объект, на который вы вызываете функцию.

Аналог C++ состоит в том, чтобы сказать, что жирная стрелка - это метод автоматического создания функтора: он позволяет вам отдать функцию в качестве обратного вызова третьей стороне, которая может вызвать ее, не зная вашего объекта, но где код, вызываемый внутри, будет иметь доступ к вашему объекту в качестве этого указателя. Он не служит никаким другим целям и не имеет никакого отношения к тому, может ли функция быть перегружена или может ли она иметь доступ к супер.

+1

Я внес изменения. в следующий раз сделайте их сами, и вы получите очки за это. :) –

+1

Я бы, но я все еще чувствую дискомфорт в редактировании чужих вещей. –

Смежные вопросы