Resposta 1º desafio

Semana passada postei um desafio em javascript para testar o conhecimento teórico dos meus amigos, somente o Coutinho respondeu:

[source:javascript]
var teste = {
teste:function(){
alert(’teste’);
}
};
teste.teste();
[/source]

ou mais bonitinho:

[source:javascript]
var teste = {
nome: ‘Coutinho’,
teste:function(){
alert(this.nome);
}
};
teste.teste();
[/source]

E acertou. Consertou o problema que propositadamente fabriquei e deu uma solução que é a mais simples e portanto a melhor: usar um objeto literal.

Vejamos:

Objetos literais são a definição de objetos na especificação ECMA-262, a especificação do JAVASCRIPT.

"An object is a member of the type Object. It is an unordered collection of properties each of which contains a primitive value, object, or function. A function stored in a property of an object is called a method."

Ela define que um objeto é uma coleção não-ordenada de propriedades onde cada propriedade contém um valor primitivo, um outro objeto ou uma function e uma function armazenada em uma propriedade dessa coleção é denominada de método. Segundo a especificação as propriedades (properties) são campos (Fields) que representam o estado e métodos (methods) que representam o comportamento.

Então a estrutura primordial de um objeto, também chamado de objeto literal é da forma que ele respondeu, que seria assim:

[source:javascript]
var obj = {
nome: ‘Coutinho’,
teste:function(){
alert(this.nome);
}
};
obj.teste();
[/source]

Outra forma muito usual pela NEW SCHOOL é instanciar uma function (lembrando que toda Function é um objeto) utilizando o paradigma de construtor com parêntesis após a construção, e utilizar a KEYWORD return para exportar o contexto e isolar o conteúdo interno de códigos maliciosos, já que os métodos apply e call não funcionam nesse tipo de estrutura, criando variáveis privadas (já que só existe o escopo público na ECMAScript).

[source:javascript]
var obj = function(){

this.nome = ‘Coutinho’;

return {
teste:function(){
alert(nome);
}
};
}();
obj.teste();
[/source]

Portanto se você tentar usar a estrutura abaixo, vai falhar porque o objeto "obj" não é uma função, já que foi transformado em objeto literal artificialmente:

[source:javascript]
function B(){
obj.call(this);
};
var teste = new B();
teste.teste();
[/source]

1 thought on “Resposta 1º desafio”

Comments are closed.