Enviar por e-mail
Imprimir
Foto por SqueakyMarmot
Prototype - extendendo objetos
Tornou-se possível extender objetos no Javascript a partir da sua versão 1.1. É possível adicionar atributos e métodos a todas as instâncias de um objeto.
Sintaxe
// Atributo
Objeto.prototype.atributo = valor;
// Método
Objeto.prototype.metodo = function() {
...
}
Has
Com prototype conseguimos extender o objeto Array, adicionando o método has, que vai verificar se existe um valor no Array.
Array.prototype.has = function() {
alert(this);
}
var teste = ['a', 'b', 'c'];
teste.has();
// a, b, c
O código é apenas um teste para verificar se o objeto Array foi extendido corretamente, imprimindo os itens do Array. Observe que os elementos do Array são acessados por this.
Array.prototype.has = function(search) {
for (var i=0; i < this.length; i++) {
if (this[i] == search) {
return true;
}
}
}
Primeira tentativa de implementar o método has. O método verifica se o valor do argumento search existe no Array, se existir retorna true.
var teste = ['a', 'b', 'c'];
if (teste.has('b')) {
alert('O valor "b" foi encontrado no Array');
}
Isso funciona até certo ponto. Se o índice do Array não for numérico ou numérico e não seguir uma seqüência vai resultar em um erro de execução. O Array é percorrido por um laço de condição tamanho do Array, não necessariamente reflete nos índices do Array.
// declara o Array
var teste = [];
// índice não numérico
teste['a'] = 'javascript';
teste['b'] = 'html';
teste['c'] = 'css';
// Erro
if (teste.has("javascript")) {
...
}
Então, como percorrer todos os elementos de um Array e acessar seus valores mesmo que os índices não sejam numéricos? Há uma solução muito simples.
var teste = [];
teste['a'] = 'javascript';
teste['b'] = 'html';
teste['c'] = 'css';
for (key in teste) {
document.writeln("Chave: "+k+", valor: "+teste[k]);
}
// resultado
Chave: a, valor: javascript
Chave: b, valor: html
Chave: c, valor: css
"Para cada índice no Array executar...". Todos os elementos do Array são percorridos, não importa se o índice for numérico ou não.
Além de verificar se o valor existe no Array, o método has retorna o índice correspondente ao valor encontrado, mas pode acontecer do índice corresponder a 0 (zero), e zero é igual falso, e retornar falso significao que não encontrou. A solução é retornar "-1" se o valor não for encontrado ou então não retornar o índice e apenas o valor booleano.
Código fonte
Array.prototype.has = function(search) {
for (k in this)
if (this[k] == search)
return k;
return -1;
}
Comentar
RSS
RSS