0

所以我是 Javascript 的新手,但我一直在研究一种与 C# 语义相似的编程语言,我想添加一个 JS 反编译器。我一直在研究在 Javascript 中实现 OOP 的各种方法,但我不完全确定它是否会进一步发挥作用。

让我从一个例子开始。这是我的语言中的一段非常简单的代码:

// test.fd
// this code will be put in package 'test'
class Foo
{
    float bar;

    - test
    {
        int x = 3;
    }
}

它输出这个:

var test = {
    function Foo(){
        this.bar = 0.0;
    };

    foo.prototype.test = function(){
        var x = 3;
    };
}

现在我有几个问题。目前,当它编译类时,它会创建 js 函数 'Foo()',我认为它实际上是一个构造函数。我想如果用户没有创建默认构造函数,我应该默认创建它,在这种情况下使用它。但是如果我想为同一个类有多个构造函数怎么办?它们是否必须具有不同的名称,我是否必须为每个构造函数重新创建所有方法和属性?

我的下一个问题是,在 JS 中实现继承的最佳方式是什么?我的语言假定所有方法都是虚拟的,因此它应该有望使多态性更容易。

谢谢大家,

4

1 回答 1

2

正如@WaleedKhan 指出的那样,您不应该为您不太了解的语言构建转编译器。

首先,您编译的代码并没有按照您的想法执行:

> var test = {
.    // Objects != namespaces
.    // Anything that is not a key: value pair is a syntax error.
.    function Test() {}
. }

SyntaxError: Unexpected identifier

如果你想要一个类似命名空间的效果,你应该使用函数,因为JavaScript 没有块作用域

var test = (function(){
// This wrapper is an immediately invoked function expression (IIFE)
// It will act as a "namespace" inasmuch as functions and variables that are
// declared with `var` will not leak into the global scope.
// However, anything that you don't *explicitly* expose will be private.

function Foo() {
    this.bar = 0.0;
}

// JavaScript is case-sensative - foo != Foo.
Foo.prototype.test = function() {
    var x = 1;
};

return {
    Foo: Foo
};

})();

至于你的问题:

是的,Foo是一个构造函数(某种意义上的)——但是,JavaScript 不支持您想要执行的那种调度。相反,您需要一个包装函数,该函数根据传入的参数调用适当的构造函数:

function FooFactory() {
    if (typeof arguments[0] === "string") {
        return new FooString(arguments[0]);
    }
    else {
        return new FooObject(arguments[0]);
    }
}

这很快就变得难以使用(尽管有一些库可以更容易地进行这种调度)。

至于如何正确地进行原型继承,你看过@bobince 对如何“正确”在 JavaScript 中创建自定义对象的回答吗?

最后,您可能想看看JavaScript 闭包是如何工作的?以及 Kangax关于JavaScript 语言复杂部分的优秀 文章(他的ES5 兼容性表也不容错过)。

如果你做到了这一步,祝你的冒险好运!

于 2012-10-27T20:55:15.037 回答