È questo il modo preferito di fare ereditarietà in JavaScript?

1

Ehi lì non sono nuovo alla programmazione né javascript, ma sono nuovo nel mondo object oriented di javascript in quanto si differenzia dalle lingue che conosco come java, c # quando si tratta di apsects orientati agli oggetti.

Fondamentalmente mi piacerebbe sapere che questo è il modo di fare ereditarietà in javascript, come posso migliorarlo e che cosa dovresti fare attenzione grazie

function Animal(name, age, color){
    this.name  = name;
    this.age   = age;
    this.color = color;
}


Animal.prototype.describeMe = function(){
      console.log("Hello I am " + this.name + " and I am " + this.age + " years old and my color is " + this.color);
};

function Dog(name, age, color, breed){
    Animal.call(this, name, age, color);
    this.breed = breed;
}

Dog.prototype = Object.create(Animal.prototype);

Dog.prototype.whatAmI = function(){
     console.log("I am a dog");
}


var dog = new Dog("Max", 10, "red", "German Shepard");
dog.whatAmI();
dog.describeMe();
    
posta Prince 21.10.2015 - 04:54
fonte

1 risposta

1

Quello che hai è uno dei tanti approcci diversi, ugualmente validi, per fare ereditarietà in ECMAScript 5.1.

Sospetto che quando ECMAScript 2015 diventerà più diffuso, la maggior parte degli usi dell'ereditarietà in ECMAScript sarà rapidamente sostituita con le nuove classi. Le classi sono state aggiunte in ECMAScript 2015 per supportare modelli di ereditarietà comuni. Nonostante il loro nome, sono non effettivamente classi, sono funzioni di costruzione e non aggiungono alcuna nuova semantica del linguaggio, sono solo zucchero sintattico per funzioni di costruzione, chiusure, prototipi, descrittori di proprietà, ecc. che sono già presenti in ECMAScript 5.1 o esistono in ECMAScript 2015 indipendentemente dalle classi. (In altre parole: lasciano che ECMAScript rimanga fedele a ECMAScript e non provi a trasformarlo in Java.)

Tuttavia, lo zucchero sintattico è dolce:

class Animal {
  constructor(name, age, color) {
    this.name  = name;
    this.age   = age;
    this.color = color;
  }

  get description() {
    return "Hello I am " + this.name + " and I am " + this.age + " years old and my color is " + this.color
  }

  describeMe() {
    console.log(this.description);
  }
}

class Dog extends Animal {
  constructor(name, age, color, breed) {
    super(name, age, color);
    this.breed = breed;
  }

  whatAmI() {
   console.log("I am a dog");
  }
}

const dog = new Dog("Max", 10, "red", "German Shepard");
dog.whatAmI();
// I am a dog
dog.describeMe();
// Hello I am Max and I am 10 years old and my color is red

Questo codice andrà a somigliare a qualcosa di molto simile al tuo, tranne che con alcune chiusure aggiuntive per l'incapsulamento. Ho anche aggiunto un getter, che non era presente nella tua versione.

Si noti che gran parte di questo zucchero sintattico per metodi e getter (e setter, che non ho dimostrato) è in realtà disponibile anche nei letterali degli oggetti, non solo nelle dichiarazioni di classe.

    
risposta data 21.10.2015 - 09:55
fonte

Leggi altre domande sui tag