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