javascript - 在 Javascript 中,属性如何修改对象

标签 javascript node.js ecmascript-6

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

比如这里socket.io docs :

Flag: 'broadcast'

Sets a modifier for a subsequent event emission that the event data will only be broadcast to every sockets but the sender.

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 的一些新功能?或者这是特定于 Node 的编码模式?
它是如何工作的/它是如何实现的?

编辑:即使 other question与文档中的摘录大致相同,但有很大不同。我的问题是关于 Javascript 的背景,而另一个问题是关于文档中的措辞。由于这个原因,答案也大相径庭。

最佳答案

我看到了您的问题并且很感兴趣,所以查看了 socket.io 源代码。

可以看到标志逻辑here .

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

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

有趣的东西。

关于javascript - 在 Javascript 中,属性如何修改对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42663058/

相关文章:

javascript - 使用 Dojo 在特定选项卡中打开 URL

javascript - dataTable addClass ('selected' )由于某种原因无法工作

javascript - 是否可以使用标记函数参数来生成完全相同的文字和占位符序列?

node.js - 打开 localhost :3000 in kiosk mode after the Node. js 服务器已完成旋转

JavaScript - 将焦点转移到悬停元素

javascript - NodeJS Web 服务器,在服务器启动时加载 html 文件时出现问题

javascript - MYSQL Node 问题

javascript - "click(e=>{"和 "click(function(e){"之间的区别

javascript - 如何导入子模块并将其别名为 ES6 中的变量

javascript - function.apply.bind 在以下代码中如何工作?