Я пытаюсь найти способ слияния или добавить некоторые методы и атрибуты модуля в классе.
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.
Если вы хотите, чтобы экземпляр 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());
var User = require('./user')
в начало player.js
если он находится в том же каталоге, что и user.js
это может быть возможным решением для вас, но не на 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();
Object.assign()
. Когда любой экземпляр вызывает becomePlayer()
, все экземпляры получат метод run()
, потому что он изменяет User.prototype
.
если вы хотите добавить метод к пользователю объекта, вы можете сделать это так:
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.