Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中截取函数调用以获取函数调用名_Javascript_Design Patterns_Software Design - Fatal编程技术网

如何在JavaScript中截取函数调用以获取函数调用名

如何在JavaScript中截取函数调用以获取函数调用名,javascript,design-patterns,software-design,Javascript,Design Patterns,Software Design,我不知道如何用词来形容这个标题,所以我会更详细地说 我想做的是有一个叫做车的物体 对象汽车包含两个对象,分别称为轮胎和引擎 我想要的是能够说 car.start(); 然后我希望car对象能够同时检查轮胎和引擎,查看它是否包含具有该名称的函数,然后调用它 总之是这样的 我希望能够调用一个对象,并让调用该对象的人将其传递给实现该函数调用的人 我查看了代理模式,但没有看到如何动态地将函数调用从对象传递到嵌套对象 任何想法都将不胜感激。谢谢 示例代码 function engine() {

我不知道如何用词来形容这个标题,所以我会更详细地说

我想做的是有一个叫做车的物体

对象汽车包含两个对象,分别称为轮胎引擎

我想要的是能够说

car.start();
然后我希望car对象能够同时检查轮胎引擎,查看它是否包含具有该名称的函数,然后调用它

总之是这样的

我希望能够调用一个对象,并让调用该对象的人将其传递给实现该函数调用的人

我查看了代理模式,但没有看到如何动态地将函数调用从对象传递到嵌套对象

任何想法都将不胜感激。谢谢

示例代码

function engine() {
    return {
        start: () => console.log('start')
    }
}

function tire() {
    return {
        getWidth: () => console.log('get width')
    }
}

function car() {
    this.tire = new tire();
    this.engine = new engine();

    // Pass on function calls made to car over to tire or engine depending on who implemented that function call.
}

// This should print start.
car.start();

**PS.*我知道我可以硬编码函数调用并让它通过,但我正在尝试动态地这样做,所以我不必声明可以调用的每个函数。所以我想动态地执行此操作。

将它们转换为实际类,然后从原型复制属性:

类引擎{
开始(){
控制台日志(“启动”);
}
}
等级轮胎{
getWidth(){
log(“获取宽度”);
}
}
班车{
构造函数(){
this.tire=新轮胎();
this.engine=新发动机();
}
}
for(Object.getOwnPropertyNames(Engine.prototype)的常量键){
如果(键!=“构造函数”){
Car.prototype[key]=函数(…args){返回这个.engine[key](…args);};
}
}
for(Object.getOwnPropertyNames(Tire.prototype)的常量键){
如果(键!=“构造函数”){
Car.prototype[key]=函数(…args){返回这个.tire[key](…args);};
}
}
const car=新车();
汽车启动;
car.getWidth();
解决这个问题:“我查看了代理模式,但没有看到如何动态地将函数调用从对象传递到嵌套对象。”

您可能没有检查代理类的“未定义”方法。在下面的代码中,注意
target[prop]===undefined
-此检查确定目标上是否存在动态方法。如果不是,则查看prop并从嵌入对象调用该方法

如果不想从嵌入对象中枚举方法,可以内省它们以查找包含该方法的对象(此处未显示)

这应该证明代理对象确实可以用于实现您的目标

函数引擎(){
this.start=()=>{
log('started');
}
}
功能轮胎(){
this.getWidth=()=>{
log('got width');
}
}
多功能车(){
this.tire=新轮胎();
this.engine=新发动机();
}
常数carProxy={
获取:功能(目标、道具、接收器){
如果(目标[prop]==未定义){
如果(prop==“getWidth”){
console.log(“获取轮胎宽度”);
返回target.tire.getWidth;
}否则如果(道具==“开始”){
console.log('starting');
返回target.engine.start;
}否则{
return()=>{
log(“未定义的函数”);
}
}
}
}
};
const target=新车()
const car=新代理(目标,carProxy);
汽车启动;

car.getWidth()也许是你想要的。你最初的问题标题中有设计模式——从这个角度看,你试图用一种不支持多重继承的语言创建多重继承。我不明白为什么代理不起作用。看看另一个网站上的代理设计模式示例,功能只是硬编码的。这并没有告诉我如何动态地传递函数。堆栈溢出问题@fblundun linked就是我想到的。我不知道代理对象存在。好主意!我没有想过。谢谢你的回复,但我希望动态地完成这项工作,而不是硬编码函数调用。对,这是我关于内省目标对象的评论。您可以在其中一个封装对象中找到缺少的方法,并以这种方式调用它。为了简单起见,我没有包含那个代码。