代码之家  ›  专栏  ›  技术社区  ›  npup

这个javascript语法我到目前为止还没见过,它到底有什么作用?

  •  22
  • npup  · 技术社区  · 14 年前

    今天我看到了一个我不熟悉的javascript语法(调用函数时)。就像:

    def('Person') ({
      init: function(name) {this.name=name;}
      ,speak: function(text) {alert(text || 'Hi, my name is ' + this.name);}
    });
    

    def('Ninja') << Person ({
      kick: function() {this.speak('I kick u!');}
    });
    

    1:第一个例子中括号内的对象发生了什么?它由 def 不知何故起作用,但我不明白这里发生了什么(见 DEF 功能如下)。物体去哪儿了?

    2:又是一样的东西,但是用 << 我从未见过的接线员(我想!)那是怎么回事?

    代码来自 http://gist.github.com/474994 Joe Dalton做了一个小的javascript OO继承(很明显这是别人工作的一部分,但似乎完全重写了)。也许你想在那里查一下 DEF 函数,我在这里给你:

    function def(klassName, context) {
      context || (context = global);
    
      // Create class on given context (defaults to global object)
      var Klass =
        context[klassName] = function Klass() {
    
          // Called as a constructor
          if (this != context) {
    
            // Allow the init method to return a different class/object
            return this.init && this.init.apply(this, arguments);
          }
    
          // Called as a method
          // defer setup of superclass and plugins
          deferred._super = Klass;
          deferred._plugins = arguments[0] || { };
        };
    
      // Add static helper method
      Klass.addPlugins = addPlugins;
    
      // Called as function when not
      // inheriting from a superclass
      deferred = function(plugins) {
        return Klass.addPlugins(plugins);
      };
    
      // valueOf is called to set up
      // inheritance from a superclass
      deferred.valueOf = function() {
        var Superclass = deferred._super;
        if (!Superclass)
            return Klass;
        Subclass.prototype = Superclass.prototype;
        Klass.prototype = new Subclass;
        Klass.superclass = Superclass;
        Klass.prototype.constructor = Klass;
        return Klass.addPlugins(deferred._plugins);
      };
      return deferred;
    }
    
    2 回复  |  直到 10 年前
        1
  •  13
  •   Gabe Timothy Khouri    14 年前

    1:电话 def('Person') 返回以对象为参数调用的函数。其原理与:

    function x() {
      return function(y) { alert(y); }
    }
    
    x()('Hello world!');
    

    2: << 接线员是左移位接线员。它将整数值左移指定位数。我找不到任何其他用途的引用,并且javascript中没有运算符重载,所以在函数中使用它没有任何意义。到目前为止,我觉得这是个打字错误。

    编辑:

    正如蒂姆解释的那样,轮班操作员只是用来向 valueOf 方法。它的工作方式就像所有操作人员的超载,接管了最初的目的,做了完全不同的事情。

        2
  •  5
  •   Anurag    14 年前

    哇,这让我的小脑袋够费解的了,但我现在知道它是如何工作的,感觉好多了:)谢谢@tim指出 valueOf() 诡计。

    创建一个 "class" 使用:

    def ("ClassName") ({
        init: function() { .. },
        foo: function() { .. }
    });
    

    是琐碎的,作为第一个呼叫 def 返回一个函数,该函数接受一个对象,并将传入对象的属性复制到 ClassName .

    更有趣的使用案例 << to子类依赖于表达式的计算顺序,以及通过隐式调用 () . 基础技巧基本上是一个共享变量,它记录了超级类和要应用于它的属性。表达式,

    def("ClassName") << ParentClass({ .. })
    

    评估如下:

    1. def("ClassName") 调用并创建全局对象 类名 并返回其构造函数函数。让我们调用这个返回的对象- initializeMeLater .
    2. ParentClass(..) 调用它来存储对 ParentClass 以及在共享变量中传入的对象/属性。
    3. initializeMeLater.valueOf() 调用,它获取对父类的引用以及该共享变量的属性,并设置原型。
    4. valueOf 对步骤2中的返回值调用,该返回值无效,因为我们已经在步骤3中设置了超类关系。

    代码试图模拟Ruby语法来创建子类,如下所示:

    class Child < Parent
        def someMethod
            ...
        end
    end