Как я могу объединить модуль в экземпляре?

1

Я пытаюсь найти способ слияния или добавить некоторые методы и атрибуты модуля в классе.

function User(data){
  this.name = data.name;
}

User.prototype.sayHello = function(){
  return this.name+' says hello.';
}

module.exports = User;

Я хотел бы добавить к моему пользователю некоторые атрибуты и методы из класса Player, когда он присоединился к игре, например.

function Player(user){
  this.chances = 3;
}

Player.prototype.run = function(){
 return this.name+' is running.';
}

Я попробовал с subClass, но я потерял все параметры от Пользователя и имею только Игрока. Я хотел бы сделать что-то вроде этого:

var user = new User({name:Jacques});

user.sayHello() // Jacques says hello.

user.becomePlayer();

user.run(); // Jacques is running.

Или можно добавить атрибуты и методы к пользовательской переменной?

user.becomePlayer() // user now can run.
  • 0
    Если классы не наследуются друг от друга, объект не может быть экземпляром обоих.
Теги:

3 ответа

0

Если вы хотите, чтобы экземпляр User получал то, что обычно называют mixins из Player (это термин JavaScript для ad-hoc-интерфейсов), вы можете сделать следующее, что я не рекомендую:

function User(data) {
  this.name = data.name;
}

User.prototype.sayHello = function() {
  return this.name + ' says hello.';
}

User.prototype.becomePlayer = function() {
  Object.assign(this, Player.prototype);
  Player.call(this);
  
  return this;
}

function Player() {
  this.chances = 3;
}

Player.prototype.run = function() {
  return this.name + ' is running.';
}

var user = new User({ name: 'Jacques' });

console.log(user.sayHello());
user.becomePlayer();
console.log(user.run());

Если вам нужен рекомендованный подход, просто запустите Player чтобы он расширил User и построил экземпляр Player для начала, например:

function User(data) {
  this.name = data.name;
}

User.prototype.sayHello = function() {
  return this.name + ' says hello.';
}

function Player(data) {
  User.call(this, data);

  this.chances = 3;
}

Player.prototype = Object.create(User.prototype);
Player.prototype.constructor = Player;

Player.prototype.run = function() {
  return this.name + ' is running.';
}

var user = new Player({ name: 'Jacques' });

console.log(user.sayHello());
console.log(user.run());
  • 0
    Здравствуйте @Patrick Roberts, как вы думаете, возможно ли расширение из другого файла? как player.js?
  • 0
    @BryanWesley конечно. Просто поместите var User = require('./user') в начало player.js если он находится в том же каталоге, что и user.js
0

это может быть возможным решением для вас, но не на 100% соответствовать вашей ситуации.

function User(data){
  this.name = data.name;
}

User.prototype.sayHello = function(){
  this.name+' says hello.';
}

function Player(user){
  this.chances = 3;
}

var run = function(){
   console.log(this.name + ' is running.');
}

User.prototype.becomePlayer = function() {
  return Object.assign(User.prototype, {run});
}

//console.log(Player.prototype.run);
var tom = new User({name: "Tom"});
tom.becomePlayer();
tom.run();
  • 0
    Это неправильное использование Object.assign() . Когда любой экземпляр вызывает becomePlayer() , все экземпляры получат метод run() , потому что он изменяет User.prototype .
  • 0
    @PatrickRoberts я рад знать, спасибо. Есть ли способ достижения цели путем реализации assign () в проблеме?
Показать ещё 2 комментария
0

если вы хотите добавить метод к пользователю объекта, вы можете сделать это так:

User.prototype =  {
    sayHello : function(){
        return this.name+' says hello.';
    },
    becomePlayer: function () {
        //do some thing
    }
}

если пользователь хочет получить доступ к методу игрока, вы можете использовать наследование (наследование цепи Prototype):

User.prototype = new Player();
var user = new User({name: 'Jacques'})

console.log(user.run());//Jacques is running.
  • 0
    Спасибо, но что, если я только хочу, чтобы атрибуты и методы Player были частью экземпляра User, просто используя метод становленияPlayer экземпляра User. Как эволюция. @Alvin
  • 0
    Я не думаю, что смогу сделать это

Ещё вопросы

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