Escopo de funções privadas do Coffeescript, acessando variáveis ​​de construtor e herança

Outro dia me deparei com uma tarefa de refatoração de um script de café comum em classe – orientado a objetos, não sou muito profissional e aprendi muito por meio de pesquisas de 2 a 3 dias que levaram a uma conclusão do prefeito sobre o escopo: É uma bagunça para novatos Como eu.

De qualquer forma, resolvi alguns problemas em que herdar era essencial

Primeiro criamos nossa classe de visualização

class FolderView
constructor: (@id , @nme) ->

Então, precisamos adicionar JST para renderização de template e criar nosso objeto html interno

class FolderView
constructor: (@id, @nme) ->
@template: "path/to/jst"
@folder_view = folder_html(@id, @nme, @template)


folder_html
= (id, name, path ) ->
$
(JST[path](id: id, name: name)) #this will return the html necesary to use our folder in the view
insert
: ->
$
("table").append(@folder_view)


folder
= new FolderView 1, "myfolder"
folder
.insert()

Isso irá inserir nossa nova pasta gerando-a via JST no conteúdo da página, mas há algo errado aqui … e se quisermos herdar seus métodos / propriedades?

nós não podemos fazer:

folder_html = (id, name, path)->
super

porque é uma função presente apenas dentro do escopo da classe principal, e se quiséssemos reproduzir o caminho do modelo como uma propriedade global? tudo que leva a isso:

class FolderView
constructor: (@id, @nme) ->
@folder_view = FolderView.folder_html(@id, @nme)

template_path
: "path/to/jst"

@folder_html: (id, name)->
@template()(id: id, name: name)

@template: ->
JST
[@prototype.template_path]

insert
: ->
$
("table").append(@folder_view)


folder
= new FolderView 1, "myfolder"
folder
.insert()

Como você pode ver, adicionamos @ a algumas das funções, isso faz referência a “this” como sabemos para coffeescript comum, mas o que isso significa ?, significa que eles se tornam “privados” ou parte da classe prototípica FolderView definindo o escopo deles , é por isso que chamamos o método fora do escopo de @template e @folder_html como:

FolderView.folder_html(@id, @name)

agora .. por que fazer isso ?, não podemos apenas deixá-los como funções comuns? como sabemos, eles se tornariam comuns:

folder_html = function(){ ....code.... }

mas então não poderíamos jogar herança e nos tornaríamos código repetitivo, e como sabemos, isso não é muito elegante, parece um senhor

então, na herança, queremos criar uma visão de formulário para criar nossas pastas na visão, então faremos isso:

class NewFolderView extends FolderView
constructor: (@parent_folder_id) ->
@folder_view = FolderView.folder_html(@parent_folder_id)

template_path
: "path/to/new_jst"

@folder_html: (parent_id) ->
@template()(parent: parent_id) #heres the point

Então aqui está o nosso ponto do artigo, como sabemos que herança significa que tudo o que nossos pais podem fazer, nós podemos !!
isso significa que quando estendemos a classe FolderView, todas as suas propriedades são herdadas dos filhos:

@template: ->

nos permite chamá-lo como um método prototípico na classe, herdando-o de qualquer classe a que esteja incluído !! e:

@template: ->
JST
[@prototype.template_path]

nos permite chamar o novo template_path declarado em NewFolderView porque queremos um “novo” template com um formulário, não o nome resultante e com id usando @prototype. “propriedade”

isso pode ter alguns problemas ou pode ser mais fácil de realizar, mas a principal preocupação era o fato de que o escopo precisa ser entendido muito bem antes de se aventurar em coisas mais complexas em coffeescript, principalmente com pouco conhecimento em javascript puro como eu