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

标签 javascript function syntax operators

今天我看到了一个我不熟悉的 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;
}

最佳答案

1:来电def('Person')返回一个函数,该函数以对象作为参数进行调用。其原理与以下内容相同:

function x() {
  return function(y) { alert(y); }
}

x()('Hello world!');

2:<<运算符是左移运算符。它将整数值向左移动特定位数。我没有找到任何其他用途的引用,并且 JavaScript 中没有运算符重载,因此我无法在函数上使用它。到目前为止,我觉得它像是一个错字。

编辑:

正如 Tim 所解释的,移位运算符仅用于引发对 valueOf 的调用。方法。它的工作原理就像是所有运算符的重载,接管了最初的目的并做一些完全不同的事情。

关于javascript - 我到目前为止还没有见过这种 JavaScript 语法,它到底有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3245639/

相关文章:

javascript - 更改 componentDidMount 中的状态后,React 组件不会更新

ios - 无法将变量从类中的函数传递到 Swift 中的另一个函数

javascript - 在 Angular 4.2.2 CLI web-api 中找不到 angular-in-memory-web-api 页面

javascript - 我需要一个想法来创建在其之前接受元素的方法

javascript - 创建一个javascript对象,然后通过for循环填充一个数组

javascript - 为什么我的基本递归无限循环?

JavaScript 将数字作为字符串连接

java - 语法错误;分配数组时

c - 了解特定 C 指针定义的学校作业

javascript - 我的 Firefox 不支持 HTML5 视频,但可以在其他地方使用