Как присвоить функции значение class в JS?

#javascript

#javascript

Вопрос:

У меня есть функция

 function log() {
    console.log('something');
}
 

что я хочу, чтобы этот объект имел:

 class Car {
  constructor(name) {
    this.name = name;
  }
  log() {
    // something
  }
}
 

Как я могу присоединить его, не повторяя код внутри функции?

Комментарии:

1. Car.log = log;

2. @WaisKamal это добавит статическую функцию. Не то же самое, что и второй

3. Вы можете сделать: Object.assign(Car.prototype, { log })

Ответ №1:

Вы можете прикрепить функцию как метод к Car прототипу, так что теперь она будет доступна как метод во всех экземплярах.

 function log() {
    console.log('something');
}

class Car {
  constructor(name) {
    this.name = name;
  }
}

Car.prototype.log = log;

const a = new Car("Audi");
const b = new Car("BMW");

a.log();
b.log(); 

Комментарии:

1. опередил тебя 😉

Ответ №2:

В принципе, вы можете сделать это тремя способами;

первый способ — использовать конструктор класса и передавать функцию в вызове конструктора

 function log() {
    console.log('something');
}


class Car {
  constructor(name,log) {
    this.name = name;
    this.log = log
  }
  
}
const audi = new Car("name",log);
audi.log(); 

второй способ — просто использовать оператор equal

 function log() {
    console.log('something');
}


class Car {
  constructor(name,log)  {
    this.name = name;
  }
  log = log
  
}


const audi =  new Car("some");
audi.log(); 

Третий способ — использовать prototype

 function log() {
    console.log('something');
}


class Car {
  constructor(name,log) {
    this.name = name;
  }
  
}

Car.prototype.log = log;

const audi =  new Car("some");
audi.log(); 

Комментарии:

1. Как я могу добавить метод получения, используя метод прототипа?

2. На самом деле прямого пути нет, но это можно сделать следующим образом -класс foo { constructor(){ this.a = «что-то»; } } класс bar расширяет foo { constructor(){ super(); } метод() { return this.a } } const newBar = new bar(); console.log(newBar.method())

Ответ №3:

Вот так

Либо как функция-член, ЛИБО в прототипе

 class Car {
  constructor(name) {
    this.name = name;
  }
  log = str => console.log(str); // or log = log if log is defined elsewhere
}

const carA = new Car();
carA.log("vroom");

// or

const logger = str => console.log(str);

Car.prototype.logger = logger;

const carB = new Car();
carA.logger("vroom"); // also available to the previous and other Car objects
carB.logger("vroom"); 

Комментарии:

1. Это повторение кода внутри функции.

2. Как так. Я определяю только одну функцию в этом скрипте, поэтому повторений нет

3. Я хочу использовать функцию, которая была определена отдельно.

4. возможно ли это также с помощью Object.setPrototypeOf()?

5. Я не знаю и не использовал этот метод. Я думаю, что нет, когда я смотрю на документацию