Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在实例中合并模块?_Javascript - Fatal编程技术网

Javascript 如何在实例中合并模块?

Javascript 如何在实例中合并模块?,javascript,Javascript,我试图找到一种方法来喜欢合并或添加类中模块的一些方法和属性 function User(data){ this.name = data.name; } User.prototype.sayHello = function(){ return this.name+' says hello.'; } module.exports = User; 我想给我的用户添加一些属性和方法从一个玩家类一旦加入了一个游戏,例如 function Player(user){ this.chance

我试图找到一种方法来喜欢合并或添加类中模块的一些方法和属性

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

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

module.exports = User;
我想给我的用户添加一些属性和方法从一个玩家类一旦加入了一个游戏,例如

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

Player.prototype.run = function(){
 return this.name+' is running.';
}
我尝试使用一个子类,但我从用户那里释放了所有参数,只有玩家的一个参数。我想这样做:

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.prototype =  {
    sayHello : function(){
        return this.name+' says hello.';
    },
    becomePlayer: function () {
        //do some thing
    }
}
如果用户想要访问播放器的方法,可以使用继承( 原型链继承):


这可能是一个可能的解决方案,但不是100%适合您的情况

功能用户(数据){
this.name=data.name;
}
User.prototype.sayHello=函数(){
这个.name+“打招呼”;
}
功能播放器(用户){
这个概率=3;
}
var run=function(){
console.log(this.name+'正在运行');
}
User.prototype.becomePlayer=函数(){
返回Object.assign(User.prototype,{run});
}
//console.log(Player.prototype.run);
var tom=新用户({name:“tom”});
汤姆。成为一名运动员;

汤姆,快跑
如果希望
User
的实例从
Player
接收通常称为mixin的内容(这是JavaScript对特殊接口的术语),可以执行以下操作,我不建议这样做

功能用户(数据){
this.name=data.name;
}
User.prototype.sayHello=函数(){
返回this.name+“打招呼”;
}
User.prototype.becomePlayer=函数(){
分配(这个,Player.prototype);
玩家。呼叫(此);
归还这个;
}
函数播放器(){
这个概率=3;
}
Player.prototype.run=函数(){
返回此值。名称+'正在运行。“;
}
var user=新用户({name:'Jacques'});
log(user.sayHello());
becomePlayer();

console.log(user.run())谢谢,但是如果我只想通过使用用户实例的becomePlayer方法使Player属性和方法成为用户实例的一部分呢。就像一场进化@AlvinI不认为我可以这样做如果两个类不能相互继承,那么一个对象就不能同时是这两个类的实例。这是对
object.assign()
的错误用法。当任何实例调用
becomePlayer()
时,所有实例都将获得
run()
方法,因为它修改了
User.prototype
@PatrickRoberts我很高兴知道,谢谢。通过在问题中实现assign()有什么方法可以达到目的吗?@PatrickRoberts为什么我不能在原型函数中使用'User.prototype.becomePlayer=function(){return Object.assign(this.prototype,{run});}',因为
this.prototype
没有提到任何东西hello@Patrick Roberts,你认为可以从另一个文件扩展吗?喜欢player.js吗?@BryanWesley当然喜欢。只要将
var User=require('./User')
放在
player.js
的顶部,如果它与
User.js
位于同一目录中。
User.prototype = new Player();
var user = new User({name: 'Jacques'})

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