<Cript> função p () {var len = argumentos.Length; for (var i = 0; i <len; i ++) {document.write (argumentos [i]+"<br/>"); }} função myclass (x, y) {this.x = x; this.y = y; this.show = function () {return this.x+this.y; }} var m1 = new MyClass (1,2); var m2 = new MyClass (3,4); p (m1.show (), m2.show ()); </cript>Problemas existentes
1. Como todas as instâncias de cópias definidas pelo mesmo método, a eficiência (eficiência da memória e execução ineficiente) podem ser resolvidas através da herança do protótipo.
2. Incapaz de acessar o controle dos valores de atributo (privado, público) pode ser resolvido por meio de fechamentos
O objeto de operação acessado por atributos não é uma variável, mas uma referência ao objeto
Processamento da leitura apenas partes inteiras de valores numéricos
Matemática [this <0? 'Celling': 'piso'] (isto);
Matriz associativa
No JS, você deve passar objetos para implementar matrizes associativas
As operações básicas são feitas por chaves, definição de elementos e exclusão de elementos.
<Cript> var map = {x: 3, y: 4}; p (map.x); excluir map.x; //truep(map.x); // indefinido O resultado do acesso a elementos inexistentes é indefinido. Como o valor pode ser definido como indefinido, é impossível julgar se o valor existe comparando o valor com indefinição. Você pode enumerá -lo por para em a = 'indefinido'; p (a); // undefinedp (typeof map.x == a); // true </sCript>Como uma matriz associativa, você deve prestar atenção a
<Cript> function myclass (x, y) {this.x = x; this.y = y;} myclass.prototype.z = 5; var obj = new myclass (1,2); para (var tecla em obj) {p (chave+":"+obj [key]); // Os atributos herdados através do protótipo serão enumerados} // x: 1 y: 2 z: 5Delete obj.x; // trruep (obj.x); //undefinedp(obj.z); // 5 // Os atributos herdados através do protótipo não podem ser excluídos, exclua obj.z; //truep(obj.z) ;//5//when usando objetos como uma matriz associativa, geralmente são criados literais. Mesmo que a visualização use um objeto vazio literal para criar uma matriz associativa sem elementos, o atributo do protótipo P ('ToString' em OBJ); // truevar obj1 = {}; p ('tostring' em obj1); // true // enumenp (obj1.length); // indefinido (var k em obj1) {p (obj1 [k]);} // nenhum elementos é enumerado. Isto é por causa do atributo enumerável.//Truevar obj1 = {}; p ('ToString' em obj1); // true // enumes de enum de p (obj1.length); // indefinido (var k em obj1) {p (obj1 [k]);} // nenhum elementos é enumerado. Isto é por causa do atributo enumerável.//Truevar obj1 = {}; p ('ToString' em obj1); // True // Atributo Auto-Like var herdado pela participação no protótipo mapa = {}; p (map.hasownsproperty ('tostring')); //FalsemapPOString'shation=1 ;p(map.HasownProperty('ToString ')); // TrueDelete Mapa ['ToString']; P (Map.HasownProperty ('ToString')); // false </sCript>Atributos
Os atributos do objeto também têm alguns atributos
A tabela a seguir resume os atributos definidos na quinta edição do ECMAScript, e o valor do atributo é definido como atributos de valor.
Tabela 1
Nome do atributo | significado |
gravável | O valor do atributo pode ser reescrito |
enumerável | Pode ser enumerado por em |
configurável | Você pode alterar os atributos e excluir os atributos |
pegar | Função getter que especifica os valores da propriedade |
definir | Função do setter que pode especificar valores de atributo |
Objetos imutáveis
Ou seja, um objeto cujo estado não pode ser alterado após a geração, e um objeto de string é um objeto imutável típico.
O uso flexível de objetos imutáveis pode melhorar a robustez do programa, como ao passar para os parâmetros do método, existe um método para reescrever o conteúdo do objeto, etc.
Objetos imutáveis podem ser implementados em JS
1. Oculte o atributo (status oculto) e não forneça operações de mudança (implementação de fechamento)
2. Uso flexível de funções fornecidas pelo ECMAScript na quinta edição
3. Uso flexível de atributos, setters e getters criáveis e configuráveis
As funções usadas para suportar objetos imutáveis no ecmascript versão 5 são mostrados na tabela a seguir
Nome do método | Novos atributos | ATRIBUIÇÃO DELETE | Mudança de valor de atributo | Método de confirmação |
prevenir extensões | x | o | o | Object.isExtensible |
selo | x | x | o | Object.iSealed |
congelar | x | x | x | Object.isfrozen |
Object.PreventExtensions Exemplo
<Cript> var obj = {x: 2, y: 3}; object.PreventExtensions (obj); // não pode adicionar o atributo obj.z = 4; p (object.keys (obj)); // x, y // não pode excluir o atributo obj.y; p (object.keys (obj)); // x // não pode adicionar o valor do atributo obj.x = 20; p (obj.x); //20//object.seal Exemplo Define o configurável do atributo para false var obj = {x: 2, y: 3}; object.seal (obj); // não pode adicionar ou excluir obj.z = 3; p (object.keys (obj)); // x, ydelete obj.x; //falsep(Object.keys(obj));//x,y//can change the attribute value obj.x=20;p(obj.x);//20//Object.freeze Example sets the writable of the attribute to false var obj={x:2,y:3};Object.freeze(obj);//cannot add or delete, nor can the attribute value obj.z = 3; p (object.keys (obj)); // x, y // pode alterar o valor do atributo obj.x = 20; p (obj.x); // 20 </script>Precisa prestar atenção
1. Para os três métodos acima, ele não pode ser restaurado depois que eles são alterados.
2. Se você deseja tornar o método herdado em herança de protótipo inalterado, precisa exibi -lo.