是否可以定义新的声明?

时间:2014-08-12 04:40:26

标签: javascript syntax

我希望能够在javascript中定义一个语句。例如,我想定义 一个名为file的语句,类似于一个类。

function file() {
 //code goes here
}

我希望将其用作语句,例如ifforreturn

file filename(filename,purpose) {
 //code goes here
}

我是否需要构建单独的编译器或者是否可能? 如果有更好的说法,请更改标题。

5 个答案:

答案 0 :(得分:0)

你想要完成什么?

您可以使用Revealing Module Pattern

在JavaScript中模拟某些类类结构

另外,我从未见过像你所描述的那样的类工作 - 通常你实例化一个类的对象,然后访问该对象的公共属性。这可以在JavaScript中完成('cept对象是动态创建的)。例如:

// file 'class'
var file = function () {

  var a; // private variable

  function filename(name, purpose) {
    // code goes here 
  }

  // return public members
  return {
    filename: filename
  };
};

// An object created from your 'class' with the member function 'filename()'
var aFile = file();

然后使用.运算符调用您的成员函数,如下所示:aFile.filename(name, purpose);

答案 1 :(得分:0)

这将是基于Javascript编写一种新语言,就像Coffeescript一样。例如,这些语言在被提供给Web浏览器之前需要将编译为 JS。

看看Coffeescript - > JS解释器知道如何解决这个问题。为了记录,我不认为这是一个好方法。

最后,我要注意像Scala这样的语言具有非常好的DSL支持,这意味着在语言中添加功能很容易。例如,Scala中的偶数+是库代码,而不是本机代码。 (从技术上讲,从语言的角度来看,可以这样写。)

答案 2 :(得分:0)

  

我希望能够在javascript中定义一个语句。

     

我希望将其用作语句,例如if,for和return。

,你不能这样做,因为Javascript解析器无法解析它。

如果您真的希望这样做,您唯一的选择就是创建自己的语言,并将您的新语言的转录器编写为Javascript,正如@djechlin指出的那样。

答案 3 :(得分:0)

我相信您想要的是实现控制结构而不是语句,因为您提供的示例ifforreturn是控制结构。如果那就是你真正的意思那么,你可以用函数来做,但不能用你描述的语法。

在javascript中,函数是第一类对象。也就是说,它们可以分配给变量并作为参数传递给其他函数。例如,这里的if实现不使用内置控件结构(没有ifwhileswitch等,也没有三元运算符) :

function IF (condition, callback) {
    [function(){}, callback][+!!condition]();
}

您可以使用上述函数替代if,但语法有点不同寻常:

IF ( a == b, function(){
    console.log('hello');
});

但是,如果你已经对javascript进行了足够长时间的编程,那么上面的语法就会很熟悉,你会遇到很多类似的控制结构,如[].forEach()setTimeout()这样的函数。

因此,如果你想实现一个控制结构来解析一个文件,你可以这样做:

function parseFile (filename, callback) {
    // code to process filename
    callback(result);
}

甚至是这样的事情:

function eachLine (filename, callback) {
    // code to process filename
    for (var i=0; i<file_content.length; i++) {
        callback(file_content[i]);
    }
}

你可以这样使用:

eachLine("some_file.txt",function(line){
    if (line.match(/hello/)) {
        console.log('Found hello! This file is friendly.');
    }
});

答案 4 :(得分:0)

如果不需要参数,可以执行以下操作:

Object.defineProperty(window, 'newcmd', {
  get: () => console.log("hello")
})

newcmd