JavaScript é a segunda linguagem de programação com quem entrei em contato após a linguagem C. Durante minhas férias de verão para calouros, encontrei uma programação JavaScript escrita em chinês na biblioteca. Naquela época, eu era quase um novato em programação. Além disso, o livro não mencionou o mecanismo de programação do JavaScript, e havia algumas palavras enganosas. Eu sempre tive um profundo mal-entendido de JavaScript, acreditando que o JavaScript é apenas uma linguagem orientada a objetos que é executada no navegador. Anotarei este artigo que é confuso e incompreendido no JavaScript. Obviamente, devido ao nível limitado do autor e à experiência de desenvolvimento, há inevitavelmente omissões, e espero que críticas e correções sejam feitas.
Objetos javascript
Qual é o objeto
A nova palavra -chave pode ser vista em todos os lugares do código JavaScript, que é fácil de entender mal que o JavaScript é um idioma baseado na herança de classe, assim como o Java. Mas esse não é o caso. Não há classes em JavaScript. Então, qual é o objeto de JavaScript que não é uma classe? Em certo sentido, os objetos JavaScript são dicionários (tabelas de hash) em Python, e na verdade são pares de valor-chave semelhantes a isso:
me = {"fisrtName": "Seek", "LastName": "Truth", "getName": function () {return this.firstName+this.LastName; // Isso é equivalente a um ponteiro para este objeto}}Este é um mal -entendido. Quando o vi pela primeira vez, me senti um pouco incompreensível, mas ainda achava razoável usá -lo com cuidado. Podemos usar o operador [] para obter elementos como Python ou usar o. Operador para obter elementos:
me.firstName // => SeekMe ["LastName"] // => verdadeMe.getName () // => SeekTruth
novo operador
Como não há aula em JavaScript, o que o novo operador está fazendo? Este é um dos aspectos mais enganosos do design do JavaScript. JavaScript é uma linguagem de programação funcional. As funções no JavaScript são cidadãos de primeira classe e as funções no JavaScript também são objetos. Os objetos da função serão adicionados aos atributos de chamada quando forem criados. O que é mais armadilha é que existem duas maneiras de chamar funções de JavaScript. Um é ligar com a nova palavra -chave, e o outro é ligar sem a nova palavra -chave. O primeiro retornará um objeto e o último retornará o conteúdo da declaração de devolução. Considere a seguinte função:
função obj (nome) {this.name = name; Nome de retorno;}Se usarmos o novo operador para ligar:
obj = novo obj ("SeekTruth") // Obj será um objeto: {"nome": "SeekTruth"}
Se ligarmos diretamente:
obj = obj ("SeekTruth") // Obj será uma string: "SeekTruth"
É realmente um design muito complicado. Quando ligamos, precisamos distinguir se precisamos usar o novo. De um modo geral, as funções que precisam usar a nova palavra -chave começarão com a capitalização.
Outra coisa complicada é que, se o valor de retorno retornado for um objeto:
função obj (nome) {this.name = name; retornar {};}Dessa forma, independentemente de chamarmos o novo operador ou não, retornaremos o valor na declaração de devolução:
novo obj ("SeekTruth") // => {} obj ("SeekTruth") // => {}Que diabos é projetado ...
Herança de objeto
protótipo
Como mencionado anteriormente, não há classe em JavaScript, então como o JavaScript implementa a herança? A resposta é através da cadeia de protótipo. No JavaScript, cada objeto possui um protótipo. Ao criar um objeto, se não for especificado, o protótipo herdado pelo objeto é objeto.Prototype. O objeto de função herdará função.prototype (function.prototype Herited Object.prototype):
Object.prototype // => {} function.prototype // => [função]Podemos ver o protótipo do objeto através da familiaridade __proto__ do objeto:
a = {} a .__ proto__ // => {}Javascript implementa herança especificando o protótipo do objeto. Existem três maneiras principais de especificar o protótipo do objeto. Uma é indicar o protótipo no construtor, o segundo é modificar diretamente o atributo __proto__ do objeto, e o terceiro é usar a função Object.Create. Vamos dar uma olhada nele por sua vez.
Especifique o protótipo no construtor
Podemos especificar o protótipo do objeto no construtor:
eu = {"primeiroName": "Seek", "LastName": "Truth", "getName": function () {return this.firstname+this.LastName; // Isso é equivalente a um ponteiro para este objeto}} função obj (nome) {this.firstname = name; este .__ proto__ = eu; // Especifique o protótipo como um objeto me}Depois de especificar o protótipo, podemos acessar as propriedades do protótipo depois de criar um novo objeto:
obj = novo obj ("foo"); // => {FirstName: 'foo'} obj.firstname // => fooobj.lastname // => tribeobj.getname () // => "Footruth"Ao acessar um objeto, você primeiro tentará encontrar a propriedade no objeto modificado. Caso contrário, volte ao protótipo para pesquisar até objeto.prototype. Se reescrevermos as propriedades (métodos) no protótipo em um novo objeto, quando o usarmos, as propriedades recém-escritas (métodos) substituirão a definição no protótipo, o que é um pouco como sobrecarregar de função em um idioma baseado em classe.
Observe que, se a propriedade LastName do protótipo ME objeto mudou, porque o objeto OBJ está procurando propriedades no protótipo, a propriedade LastName do objeto OBJ também mudará:
me.lastName = "me" obj.lastname // => "me" obj.getname () // => "foome"
Altere o protótipo do objeto diretamente
Também podemos especificar diretamente (alterar) o protótipo do objeto:
obj2 = {} obj2 .__ proto__ = meobj2.firstname // => SeekObj2.LastName // => "me" obj2.getName () // => "Seekme"Use a função Object.Create
Embora os dois primeiros métodos possam resolver o problema, essas duas maneiras de escrever não são elegantes, porque o JavaScript não é um idioma baseado em classe, e a primeira maneira de escrever é fácil de entender mal. Crockford, o autor da essência do idioma JavaScript, acredita que o novo não deve aparecer no idioma JavaScript, e é recomendável usar o objeto.Criar a função para criar objetos com base no protótipo. O uso do objeto.Create Função é muito simples:
obj3 = object.create (me) // Crie um novo objeto comigo como o protótipo obj3.firstname // => SeekObj3.LastName // => "me" obj3.getName () // => "SeekMe"
obj3 = object.create (me) é equivalente a obj2 = {}; obj2.proto = eu, mas o primeiro é escrito de maneira mais elegante e fácil de entender.
Resumir
Como uma linguagem de programação baseada em protótipo e funcional, o JavaScript possui muitas elegância e poder no design, mas ao mesmo tempo tem muitas escoras e armadilhas. Para o máximo, JavaScript também é o idioma que é mais incompreendido. Depois de aprender o mecanismo de herança do objeto de JavaScript, sinto que meu nível melhorou muito.
A breve discussão acima dos objetos JavaScript e a herança é todo o conteúdo que compartilho com você. Espero que possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.