如何在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。
我希望这有帮助。