在文件之间共享“这个”

我正在创build一个有很多方法的对象,并试图避免我的文件非常长。 问题是一些方法引用对象中的其他信息。 我想能够做到这样的事情:

index.js

var User = function(first, last){ this.firstname = first; this.lastname = last; }; User.prototype.name = require('./methods/name.js') 

方法/ name.js

 module.exports = { full: function(){ return this.firstname + " " + this.lastname; }, formal: function(){ return "Mr. " + this.lastname; } }; 

这是有道理的,为什么this在这种情况下不起作用,但有没有一种不同的解决scheme可以引用其他文件? 唯一我能想到的是使用fs和eval()而不是require,但是对我来说这似乎是一个破解,或者显而易见有一个长文件。 有什么更好的吗?

我打算在原型上有大约35个物体,每个物体上平均有4种方法。 build议? 谢谢。

这个问题与它在单独的文件中没有任何关系。 如果你像这样定义用户,你会在同一个文件中得到同样的问题:

 var User = function(first, last){ this.firstname = first; this.lastname = last; }; User.prototype.name = { full: function(){ return this.firstname + " " + this.lastname; }, formal: function(){ return "Mr. " + this.lastname; } }; 

因为当你调用someuser.name.full() this将被绑定到someuser.name而不是someuser

如果你不需要命名空间这些函数,只是这样做,因为你不确定如何从另一个文件扩展原型,你可以使用Object.assign :

 Object.assign( User.prototype, require('./methods/name.js') ); 

那么你可以调用someuser.full()someuser.formal() ,当然this将有正确的值。

你可以像这样绑定这些函数:

 User.prototype.name = require('./methods/name').bind(this) 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

bind()方法创build一个新的函数,当被调用的时候,它的this关键字被设置为提供的值,并且在调用新函数之前提供给定的参数序列。

在您的需求path中也丢失.js

这应该保持你的代码模块化

// index.js

 var userMethods = require('.methods/name.js'); var User = function(first, last){ this.firstname = first; this.lastname = last; }; User.prototype.name = userMethods.full; User.prototype.formalName = userMethods.formal; var Abbey = new User('Abbey', 'Jack'); console.log(Abbey.firstname); // Abbey console.log(Abbey.lastname); // Jack console.log(Abbey.name()); // Abbey Jack console.log(Abbey.formalName()); // Mr. Jack 

//方法/ name.js

 module.exports = { full: function(){ return this.firstname + " " + this.lastname; }, formal: function(){ return "Mr. " + this.lastname; } };