使用面向对象的JavaScript进行原型链

时间:2019-05-13 14:16:53

标签: javascript

我需要做这样的事情:

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

但是我如何像提供的示例中那样深入并链接?

4 个答案:

答案 0 :(得分:1)

您需要您的函数来返回特定类型,如下所示:

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

function user (usr) {
    return new Message(usr); // Return some message
}

答案 1 :(得分:1)

您似乎正在将原型链与功能链混为一谈。前者是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以外的对象,那也是可能的,但是确切的返回值将取决于您要执行的操作。

答案 2 :(得分:1)

您可以使用类和流模式

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

答案 3 :(得分:0)

由于您的标题中包含“面向对象”,因此我想借此机会举例说明一种面向对象的方法来对此进行分析。

首先,我们要确定引发动作的对象。 “发送”不是对象,它是动作的名称,因此不会成为我们的对象。您的代码中还有两个候选对象:用户和消息。

有两种查看方式。

  1. 消息会照顾自己。
  2. 用户执行所有操作。

1的优点。

  • 将处理消息的功能本地化为特定的类

1的缺点。

  • 看上去很奇怪。消息通常是被动的。

优点2。

  • 从语义上讲是合理的。人们根据消息采取行动,而不是相反。

2个缺点。

  • 如果用户对自己所做的一切负责,则该课程将变得肿且难以维护。

因此,在避免不良语义或避免使类膨胀时,我们之间存在冲突。

也许还有第三种方式。如果我们有一个确保消息到达目标位置的对象怎么办?

在现实世界中就是邮局。

这实际上为我们提供了工厂模式类型类。

function PostOffice()
{
} 

PostOffice.prototype.createMessage = function(messageBody) 
{
  this.message = 
  {
    "body":messageBody, 
    "fromUser": null, 
    "toUser": null
  };
  return this;
};

PostOffice.prototype.from = function(user)
{
  this.message.fromUser = user;
  return this;
};

PostOffice.prototype.to = function(user)
{
  this.message.toUser = user;
  return this;
};

PostOffice.prototype.send = function()
{
  //whatever sending means 
};

var po = new PostOffice();
po.createMessage('hi').from('user1').to('user2').send();

这显然是一个玩具示例,但希望您能理解。