开发者问题收集

使用 JavaScript 面向对象的原型链

2019-05-13
52

我需要做这样的事情:

send('message').user('usr1').message('msg').to('usr2');

因此 send 函数接受一个参数并且有一个名为 user 的原型,而 user 接受一个参数并且有一个名为 message 的原型,等等。

我刚刚写了这个

function send(type){
    console.log(type);
}

send.prototype.user = function (usr) {
    console.log(usr);
}

但是我怎样才能像在提供的示例那样深入并链接起来呢?

3个回答

您可以使用类和流程模式

class Sender {
  constructor(msg) {
    this.msg = [msg];
  }

  user(usr) {
    this.usr = usr;
    return this;
  }

  message(msg) {
    this.msg.push(msg);
    return this;
  }

  to(usr) {
    this.to = usr;
    console.log(this);
    return this;
  }
}

function send(msg) {
  return new Sender(msg);
}

send('message').user('usr1').message('msg').to('usr2');
Kamil Kiełczewski
2019-05-13

您需要您的函数返回如下特定类型:

function send(type){
    return new User(type); // Return some user
}

function user (usr) {
    return new Message(usr); // Return some message
}
MauriceNino
2019-05-13

您似乎将原型链与函数链混为一谈。前者是 javascript 实现继承的方式。后者似乎是您想要执行的操作:调用一个函数,然后根据其返回值调用另一个函数,然后根据其返回值调用另一个函数,等等。

在许多情况下,函数链涉及函数返回对其所在对象的引用。例如:

const sampleObject = {
  sayHello: function() {
    console.log('hello');
    return this; // <-- necessary to allow function chaining
  },
  sayGoodBye: function() {
    console.log('good bye');
    return this;
  }
}

sampleObject.sayHello().sayGoodBye();

如果您希望函数返回除 this 之外的对象,这也是可能的,但具体返回什么将取决于您要执行的操作。

Nicholas Tower
2019-05-13