在文件之间共享“这个”
我正在创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; } };