如何在Javascript中修改一个属性的属性

我是新来的node.js,但写了多年的Javascript,我偶然发现一个模式,我不明白:一个Flag sets a modifier对象sets a modifier

例如这里socket.io文档 :

标志:“广播”

为后续事件发射设置一个修饰符,事件数据只会发送给发送者的每个套接字。

 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是一个修饰符集相同的对象?!

如何访问一个objet的属性返回对象本身?

这是Javascript的function,我忽略了多年? 或者,这是我不知道的ES6的一些新function? 或者这是一个特定于节点的编码模式?
它是如何工作/实现的?

编辑:即使另一个问题是关于在文档中相同的exerpt,它是非常不同的。 我的问题是关于Javascript的背景,而另一个是关于文档中的措辞。 这个原因的答案也是非常不同的。

我看到你的问题,并感到好奇,所以看看在socket.io源。

你可以看到这里的标志逻辑。

 flags.forEach(function(flag){ Object.defineProperty(Socket.prototype, flag, { get: function() { this.flags[flag] = true; return this; } }); }); 

它使用一个描述符来定义属性getter,它在内部设置标志并返回对象实例。

有趣的东西。

洛伦茨,这不是什么新的JavaScript。 该方法能够对它的对象做一些突变,然后从改变它的方法返回相同的对象。 通过这样做,可以创build一个长长的命令链,以便轻松完成任务。 这里是一个例子:

 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(); 

从这个例子中,你可以看到方法“withName”改变对象,然后返回对象本身。 从这一点,你可以调用另一个对象的方法(即printName)。 从这一点来看,名称的新价值是“myNewName”。

请注意,以这种方式改变对象不是一个好习惯。 命令的链接在函数式编程中通常是一个好的概念,但是命令的链接应该是不变的。

因此,利用这种从方法中返回对象的最佳方式是,首先创build初始对象的副本,然后改变副本,然后从方法中返回副本。 这将使事情变得更容易理解和debugging。

我希望这有帮助。