Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.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中使用OOP,而是使用委派_Javascript_Composition_Delegation - Fatal编程技术网

我想停止在javascript中使用OOP,而是使用委派

我想停止在javascript中使用OOP,而是使用委派,javascript,composition,delegation,Javascript,Composition,Delegation,在涉猎javascript一段时间后,我逐渐相信OOP不是正确的方法,或者至少不是广泛的方法。有两个或三个继承级别是可以的,但像Java中那样使用完整的OOP似乎并不合适 该语言支持本机合成和委派。我只想用这个。然而,我在复制OOP的某些好处时遇到了困难 即: 如何检查对象是否实现了特定行为?我想到了以下方法 检查对象是否有特定的方法。但这将意味着标准化方法名称,如果项目很大,它可能很快变得麻烦,并导致java问题(object.hasMethod('EmailRegexValidatorSi

在涉猎javascript一段时间后,我逐渐相信OOP不是正确的方法,或者至少不是广泛的方法。有两个或三个继承级别是可以的,但像Java中那样使用完整的OOP似乎并不合适

该语言支持本机合成和委派。我只想用这个。然而,我在复制OOP的某些好处时遇到了困难

即:

  • 如何检查对象是否实现了特定行为?我想到了以下方法
    • 检查对象是否有特定的方法。但这将意味着标准化方法名称,如果项目很大,它可能很快变得麻烦,并导致java问题(object.hasMethod('EmailRegexValidatorSimplesSuperLongNotConflictingMethodName'))…它只是解决了OOP的问题,而不是解决它。此外,我找不到有关查找是否存在方法的性能的信息
    • 将每个合成的对象存储在一个数组中,并检查该对象是否包含合成器。类似于:object.hasComposite(compositorClass)…但这也不是很优雅,而且还是OOP,只是不是标准方式
    • 让每个对象都有一个“implements”数组属性,并让对象负责说明它是否实现了某种行为,无论是通过组合还是本机实现的。灵活而简单,但需要记住一些约定。到目前为止,这是我首选的方法,但我仍在寻找
  • 如何在不重复合成对象的所有设置的情况下初始化对象?例如,如果我有一个“textInput”类,该类使用一定数量的验证器(必须使用变量初始化),以及一个类“emailInput”它使用完全相同的验证器,重复代码很麻烦。如果验证器的接口发生变化,则每个使用它们的类中的代码都必须发生变化。我该如何轻松地进行设置呢?我想到的API应该与执行object.compositors一样简单('emailValidator','lengthValidator','…'))
  • 让应用程序中运行的大多数函数通过apply()是否会导致性能损失?因为我将广泛使用委托,基本对象很可能几乎没有方法。所有方法都将由合成对象提供
  • 有什么好的资源吗?我读过无数关于OOP与委派的文章,以及委派的好处等,但在一个大框架的范围内,我找不到任何可以讨论“javascript委派正确完成”的内容
  • 编辑 进一步解释:

  • 我还没有代码,我一直在纯面向对象的框架上工作,我陷入了困境,需要多重继承。因此,我决定完全放弃类。因此,我现在只停留在理论层面,并试图从中理解
  • “Compositing”可能是个错误的词;我指的是,它对于树状结构非常有用。确实,前端很少有树状结构(当然,除了DOM),但我是为node.js开发的
  • 我所说的“从OOP切换”的意思是,我将不再使用定义类、使用“new”操作符等等;我打算使用匿名对象,并使用委托器对其进行扩展。例如:

    var a = {};
    compositor.addDelegates(a,["validator", "accessManager", "databaseObject"]);
    
  • 因此,“类”是一个具有预定义委托器的函数:

      function getInputObject(type, validator){
           var input = {};
           compositor.addDelegates(input,[compositor,renderable("input"+type),"ajaxed"]);
           if(validator){input.addDelegate(validator);}
           return input;
      }
    
    这有意义吗

    1) 如何检查对象是否实现了特定行为

    大多数人不需要像这样测试方法的存在性

    • 如果您想测试方法以进行分支并在发现或未发现的情况下执行不同的操作,那么您可能正在做一些邪恶的事情(这种
      instanceof
      通常是OO代码中的一种代码气味)

    • 如果您只是检查一个对象是否实现了一个用于错误检查的接口,那么它并不比不测试并在找不到该方法时抛出异常好多少。我不知道有谁会定期做这项检查,但我肯定有人在做

    2) 如何在不重复合成对象的所有设置的情况下初始化对象

    如果将内部对象构造代码封装在函数或类中,那么我认为可以避免大部分重复和耦合

    3) 让应用程序中运行的大多数函数通过apply()是否会导致性能损失

    根据我的经验,我宁愿避免处理
    这个
    ,除非绝对必要<代码>这个非常灵活,在回调内部中断(我广泛用于迭代和异步内容),很容易忘记正确设置它。我尝试用更传统的方法来写作。例如:

  • 使每个拥有的对象完全独立,而不需要查看其兄弟或所有者。这允许我直接调用它的方法,并让它成为自己的
    This

  • 以属性的形式或作为传递给其方法的参数,向所属对象提供对其所有者的引用。这允许合成单元访问所有者,而无需正确设置
    This

  • 使用mixin,在单个级别中展平单独的合成单元。这有着大名鼎鼎的冲突问题,但允许每个人看到对方并分享相同的“这”。mixin还将代码与合成结构中的更改分离,因为不同的合成分区仍将平坦化为相同的混合对象

  • 4) 有什么好的资源吗


    我不知道,如果你找到了,告诉我:)

    2。好的,只要有一个验证器类,然后由TextInput和EmailInput类使用。。。我是说,当两个人