2013-05-27 4 views
-1

У меня есть простое наследование. Однажды начавшись, я могу узнать, какой класс он, глядя вверх имя конструктора:как ссылаться на имя класса расширенного класса из базового класса (this.contextor.name) в CoffeeScript или JavaScript

someClass = new SomeClass() 
console.log someClass.constructor.name //SomeClass 
base = new Base() 
console.log base.constructor.name //Base 

Я хотел бы получить доступ к имени класса текущего объекта в классе Base в методе сохранения() для пример:

class Base 
    constructor: (obj) -> 
    ... 
    save: (fn) -> 
    @constructor.name 

Как вы видите, я пытаюсь сделать это через «@ constructor.name», но это не работает. Короче говоря, я хотел бы ссылаться на имя расширенного класса из базового класса. Как это сделать? Спасибо

+0

Может быть полезно: http://coffeescript.org/#classes –

+1

То, что вы делает работу (за исключением http://jsfiddle.net/bYUwM/ – bfavaretto

+0

Возможно, вы вызываете 'save', когда он не привязан к экземпляру' Base'? Попробуйте заменить 'save: (fn) ->' на 'save: (fn) =>' и посмотреть, исправляет ли это его. Также попробуйте 'console.log this' в вашей' save' функции, чтобы увидеть, что это на самом деле в то время, когда вы вызываете эту функцию. –

ответ

1

Сделав пару изменений в коде примера here, я пришел с этим

class Shape 
    constructor:() -> 

    type:() -> 
    console.log @constructor.name 

class Square extends Shape 

class Circle extends Shape 

sq = new Square 
ci = new Circle 

sq.type() // Square 
ci.type() // Circle 

Edit: Если вы хотите, чтобы получить имя Shape при использовании класса Square или Circle (то есть название класса, из которого был активирован вызывающий класс), то это будет

console.log @constructor.__super__.constructor.name 

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

Я понял, что вы можете следовать этому пути, когда я увидел в генерируемый JavaScript

function Square() { 
    _ref = Square.__super__.constructor.apply(this, arguments); 
    return _ref; 
} 
+1

Спасибо, Пол. моя ошибка в нескольких областях. В моем методе сохранения у меня была область http.request, в рамках которой была еще одна область redis.hashCommand. Поэтому, ссылаясь на @ constructor.name, он ссылался на неправильную область. Таким образом, делая сначала «self = @», а затем в другой области «self.constructor.name» было решением – latvian

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