我需要做这样的事情:
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);
}
但是我如何像提供的示例中那样深入并链接?
答案 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的优点。
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();
这显然是一个玩具示例,但希望您能理解。