我是node.js的新手,但写了很多年的Javascript,我偶然发现了一个我不明白的模式:Flag
sets a modifier
对象。< / p>
标志:'广播'
为后续事件发射设置一个修饰符,事件数据只会广播到发送者的每个套接字。
var io = require('socket.io')();
io.on('connection', function(socket){
socket.broadcast.emit('an event', { some: 'data' }); // everyone gets it but the sender
});
此处socket
是一个对象,broadcast
是该对象的属性,而socket.broadcast
是与修饰符集相同的对象?!
如何访问对象的属性返回对象本身?
这是我多年来忽略的Javascript功能吗?或者这是ES6的一些新功能,我不知道?或者这是节点特有的编码模式?
它是如何工作的/它是如何实现的?
修改,即使other question与文档中的内容大致相同,但它却非常不同。我的问题是关于Javascript的背景,而另一个是关于文档中的措辞。由于这个原因,答案也非常不同。
答案 0 :(得分:4)
我看到了你的问题并且很感兴趣,所以请查看socket.io
来源。
您可以看到标记逻辑here。
flags.forEach(function(flag){
Object.defineProperty(Socket.prototype, flag, {
get: function() {
this.flags[flag] = true;
return this;
}
});
});
它使用descriptor来定义属性getter,它在内部设置标志并返回对象实例。
有趣的东西。
答案 1 :(得分:0)
Lorenz,这不是javascript的新功能。该方法能够对其对象进行一些变异,然后从变异它的方法返回相同的对象。通过这样做,可以创建一长串命令以便轻松完成任务。这是一个例子:
function person () {
this.name = 'henry';
this.withName = function (newName) {
this.name = newName;
return this;
}
this.printName = function () {
console.log(this.name);
}
}
var me = new person ();
me.printName();
me.withName('myNewName').printName();
me.printName();
从这个例子中,你可以看到方法&#34; withName&#34;改变对象,然后返回对象本身。从这一点开始,您可以调用另一个对象的方法(即printName)。从现在开始,名称的新值是&#39; myNewName&#39;。
请注意,以这种方式改变对象不是一个好习惯。命令的链接在函数式编程中通常是一个很好的概念,但命令的链接应该是不可变的。
因此,利用这种从方法返回对象(如初始对象)的概念的最佳方法是首先创建初始对象的副本,然后改变副本,然后从方法返回副本。这将使事情更容易理解和调试。
我希望这会有所帮助。