是否可以定义新的声明?

问题描述 投票:0回答:5

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

function file() {
 //code goes here
}

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

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

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

javascript syntax
5个回答
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);


0
投票

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

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

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


0
投票

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

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

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

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


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.');
    }
});

0
投票

如果您不需要参数,您可以这样做:

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

newcmd
© www.soinside.com 2019 - 2024. All rights reserved.