在JavaScript中创建一个可链接的对象方法

时间:2015-05-27 19:29:18

标签: javascript method-chaining

我一直在与这个项目进行斗争并理解这个概念,但却无法理解如何获得最终结果。

鉴于此代码:

<!doctype html>
<html>
<head>
  <title> Make an objects methods chainable </title>
  <meta charset="utf-8">
  <script>

  function modifyFunction(f) {
    return function() {
      var returnValue = f.apply(this, arguments);

       if (returnValue === undefined) {
          return this;
       } else {
          return returnValue;
       }
     };
   }

   function modifyMethod(o, m) {
   // your code here
   //the object being passed is the var o
  //the method being passed is the add or sub functions contained in the
  // var

  var methodIn = o[m]; 
  var objectIn = o;
  var numIn;

  console.log("Method In: " + methodIn);
  console.log("Object In: " + objectIn);

    if (o.hasOwnProperty(m) ) { 
     var property = o[m];   
     console.log(property);
     console.log("o has property " + m); 
     modifyFunction(this);

     if (methodIn instanceof Function) {
     //  if (this instanceof o) {

       modifyFunction(o);
       return this;
       console.log("This after modifyFunction: " + this);
       console.log("after modifyFunction " + this);

     }        
        modifyFunction(m);   
      } 

 if (!o.hasOwnProperty(m)) {
    console.log("Function not contained in Object");
 }


}  

var o = {
  num: 0,
  add: function(x) {
    this.num += x;
 },
  sub: function(x) {
    this.num -= x;
 }
};

 // We cannot chain object o(s) method because they do not return 
 //--this--
 //o.add(4).sub(2); // fail - the methods are not chainable yet!

 // Make the add method chainable.

   modifyMethod(o, "add");

   // Now we can chain the add methods
   o.add(2).add(4);
   //console.log(o.num); // o.num = 6

   // Now make the sub method chainable

   //modifyMethod(o, "sub");

   // Now we can chain both the sub and add methods

  //o.sub(1).add(3).sub(5);
  //console.log(o.num);  // o.num = 3
 </script>
</head>
<body>
</body>
</html>

目标是使用hasOwnProperty和instanceof来检查传入的对象是否传入了method属性,我理解这一点并且可以在控制台中看到结果。应该检查instanceof以查看对象的属性是否是函数的实例,我对此不太清楚并且继续收到错误消息(函数预期)。如果我正确理解这一点,我需要将信息传递给modifyFunction来执行计算吗?

我看到对象被传递给函数和方法(add和sub)函数,但是无法弄清楚我需要做些什么才能使它工作。我为此代码提前道歉,但有人可以帮我理解如何将“这个”整合在一起吗?

我查看了有关此主题的所有帖子,但仍无法通过我的头脑。 谢谢!

1 个答案:

答案 0 :(得分:0)

函数可以像JavaScript中的变量一样传递,但它们本质上是不可变的,就像字符串一样。如果我给你这个代码:

a = "my string";
b = a;

...然后要求您将a更改为&#34;您的字符串&#34;,但没有任何a =块(因此,更改实际的&#34;我的字符串&# 34;对象,而不是参考),然后禁止一些可能极端的JS黑客措施,你无法做到。他们创建并保持不变 - 但通常有方法可以创建与现有类似的方法。

同样,因为你不能改变&#34;一个函数,modifyFunction并没有完全按照您的想法行事,因为您并未将其调用结果分配给任何内容。因此,在某些方面,我批评的是术语差异 - 你无法修改&#34;一个函数,但是,您可以将其本地参考替换为引用原始参考并执行您喜欢的参考。尝试替换这部分代码;并且您可以删除modifyFunction

的其他实例
if (methodIn instanceof Function) {
 //  if (this instanceof o) {

   o[m] = modifyFunction(m);
   return o;

}

你最近注意到的另一个问题是你将对象传递给modifyFunction,而不是方法。此外,您的功能无法以正确的方式调用以使用this关键字。它是从全局上下文中调用的,因此this可能只是window。只需将this的任何其他必要参考更改为o,就可以了。