如何在Javascript属性中修改对象

时间:2017-03-08 04:30:14

标签: javascript node.js ecmascript-6

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

例如socket.io docs

  

标志:'广播'

     

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

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的背景,而另一个是关于文档中的措辞。由于这个原因,答案也非常不同。

2 个答案:

答案 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;。

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

因此,利用这种从方法返回对象(如初始对象)的概念的最佳方法是首先创建初始对象的副本,然后改变副本,然后从方法返回副本。这将使事情更容易理解和调试。

我希望这会有所帮助。