Методы схемы Мангуста или функции-прототипы?

1

У меня вопрос о функциях и классах ES6. Я не уверен, что новые объекты, созданные из схемы мангуста, дублируют функции для каждого нового объекта. И какой лучший подход при использовании классов ES6. Я написал соответствующий пример, чтобы показать, что я имею в виду.

// models/User.js
const mongoose = require('mongoose');

// User Schema
const userSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
    unique: true,
  },
});


userSchema.methods.say = function testFunc(text){
  console.log('${this.name} said ${text}')
}

module.exports = mongoose.model('User', userSchema);

// models/Animals.js
const mongoose = require('mongoose');

// Animal Schema
class Animal extends mongoose.Schema {
  constructor() {
    const animal = super({
      name: {
        type: String,
        required: true,
        unique: true,
      },
    });
    animal.methods.say = this.say;
  }

  say(text) {
    console.log('${this.name} says ${text}')
  }
}

module.exports = mongoose.model('Animal', new Animal)

// First test example
const User = require('./models/User');
const john = new User({name: "John"});
const jane = new User({name: "Jane"});

john.say('Dog goes woof.');
jane.say('Cat goes meow.\n');

User.prototype.write = function(text) {
  console.log('${this.name} wrote ${text}');
}

john.write('There\ just one sound that no one knows.')
jane.write('What does the fox say?\n')

// Second test example
const Animal = require('./models/Animal');
const fox = new Animal({name: "Fox"});

fox.say('Ring-ding-ding-ding-dingeringeding!');

Animal.prototype.screams = function(text) {
  console.log('${this.name} screams ${text}');
}

fox.screams('Wa-pa-pa-pa-pa-pa-pow!')

Прежде чем решить свой первый вопрос, я довольно много искал как переполнение стека, так и выход из него, но я никак не мог связать в своем проекте с вопросами, которые я нашел, поэтому я написал эти примеры, чтобы помочь изобразить мой вопрос.

Оба этих примера работают нормально, я просто не уверен, что функции внутри схемы дублируются для каждого нового объекта, который я создаю, я знаю, что добавление его в прототип не означает, что добавление его к прототипу будет лучшим подходом и использует классы ES6, как это необходимо?

Заранее благодарю вас за то, что я очень смущен этой темой.

Обновление: если кто-то еще приходит сюда с тем же вопросом, после прочтения следующей ссылки вещи просто щелкнули для меня. https://github.com/getify/You-Dont-Know-JS/blob/master/es6%20%26%20beyond/ch3.md#classes

Теги:
mongoose-schema

1 ответ

0
Лучший ответ

от ссылки. Эквивалент прототипа в ES6

Синтаксис класса - это более или менее просто синтаксический сахар для конструкторской функции + прототип. То есть результат (почти) эквивалентен

function User(args) {
   this.args = args
}
User.prototype.doSomething = function() { 

};

//стиль es6

Class User(){
   constructor(args){
      this.args= args
   },
  doSomething(){

  }
}

оба эквивалентны

  • 0
    Понятно, спасибо. Я предполагаю, так как это синтаксический сахар, мне все равно придется использовать User.prototype, если я хочу добавить функции в класс после создания экземпляра?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню