<h2>Padrão de Herança - Funcional</h2>
<p>
Uma fraqueza dos padrões de herança que temos visto até agora é que nós não temos nenhuma privacidade.
Todas as propriedades de um objeto são visíveis. Nós não temos variáveis privadas e não há métodos privados. Às vezes, isso não tem importancia, mas às vezes isso é muito importante. Frustrados, alguns programadores desinformados adotaram um padrão de privacidade falso.
</p>
<p>
Se eles têm uma propriedade que eles desejam fazer privada, eles dão-lhe um nome de aparência estranha, com a esperança de que outros usuários do código irão fingir que eles não podem ver os membros que procuram. Felizmente, temos uma alternativa muito melhor em uma aplicação do padrão de módulo.
</p>
<p>
Começamos fazendo uma função que irá produzir objetos. Vamos dar-lhe um nome que começa com uma letra minúscula, porque não vai exigir o uso do prefixo <em>new</em>. A função contém quatro etapas:
</p>
<ul>
<li>Cria um novo objeto. Há muitas maneiras de se criar um objeto. Ela pode criar um objeto literal, ou pode chamar uma função construtora com o prefixo <em>new</em>, ou pode usar o método Object.create para criar uma nova instância de um objeto existente, ou pode chamar qualquer função que retorne um objeto.</li>
<li>Opcionalmente define variáveis de instância privadas e métodos. Estas são apenas variáveis comuns da função.</li>
<li>Aumenta o novo objeto com métodos. Esses métodos terão acesso privilegiado aos parâmetros e as variáveis definidas na segunda etapa.</li>
<li>Ela retorna esse novo objeto.</li>
</ul>
<p>
Aqui está um modelo de pseudo-código para um construtor funcional (texto em negrito acrescentado para dar ênfase):
</p>
<pre>
var constructor = function (spec, my) {
var that, <strong>Other private instance variables;</strong>
my = my || {};
<strong>Add shared variables and functions to my</strong>
that = a new object;
<strong>Add privileged methods to that</strong>
return...
CSS
body {
font-family: Verdana;
}
pre {
background-color: #CCC;
}
JavaScript
var mammal = function (spec) {
var that = {};
that.get_name = function ( ) {
return spec.name;
};
that.says = function ( ) {
return spec.saying || '';
};
return that;
};
var myMammal = mammal({
name: 'Herb',
saying: 'Olá'
});
console.log(myMammal.says());
var cat = function (spec) {
spec.saying = spec.saying || 'meow';
var that = mammal(spec);
that.purr = function (n) {
var i, s = '';
for (i = 0; i < n; i += 1) {
if (s) {
s += '-';
}
s += 'r';
}
return s;
};
that.get_name = function ( ) {
return that.says( ) + ' ' + spec.name + ' ' + that.says( );
};
return that;
}
var myCat = cat({name: 'Henrietta'});
console.log(myCat.get_name());
Please Whitelist JSFiddle in your content blocker.
Help keep JSFiddle free for always by one of two ways:
Whitelist JSFiddle in your content blocker (two clicks)
Go PRO and get access to additional PRO features →
Join the 4+ million users, and keep the JSFiddle dream alive.
Ad-free
All ads in the editor and listing pages are turned completely off.
Use pre-released features
You get to try and use features (like the Palette Color Generator) months before everyone else.
Fiddle collections
Sort and categorize your Fiddles into multiple collections.
Private collections and fiddles
You can make as many Private Fiddles, and Private Collections as you wish!
Console
Debug your Fiddle with a minimal built-in JavaScript console.