我想向内部类的原型(prototype)添加一个方法。那可能吗?

这是我尝试的:

var Foo = function Foo() {};
Foo.prototype = {

    Bar: function Bar() { },
    Bar.prototype: { // <- this does not work

        barMethod: function () {
            console.log('hello');
        }

    },

    fooMethod: function () {
        var bar = new this.Bar();
        bar.barMethod();
    }

}

var foo = new Foo();
foo.fooMethod();

但是Bar.prototype不起作用,它将引发SyntaxError和消息Unexpected token .

最佳答案

您的问题是您正在定义Foo.prototype对象,因此,您必须遵守对象创建的规则和语法,例如,解析器希望您以key: value, nextkey: nextvalue格式列出属性,即Bar.prototype不适合。 (键实际上是字符串,在它们中使用.没有意义,因为它们在解析时会产生歧义*)

试试这个:

var Foo = function Foo() {};
Foo.prototype.Bar = function Bar() { };
Foo.prototype.Bar.prototype = {

    barMethod: function () {
        console.log('hello');
    }

};

但是,在语义上存在细微的差异,因为这样您就不会覆盖原型(prototype),而只是扩展了原型(prototype)。 (考虑首先将其等于{},然后将其扩展为您尝试创建的对象的每个属性)

(*)关于歧义的注释:我在上面提到,在对象键中包含.会产生歧义,这是一个简单的示例:
var foo = {
   bar: {
       baz: 0,
       qux: 20
   },
   bar.baz: 150 //note that this will throw an error
};
console.log(foo.bar.baz);

如果上面的代码不会引发错误,那么您期望console.log(foo.bar.baz)输出0还是150?

这就是为什么在键中使用.毫无意义的原因,也是解析器在任何.上引发意外 token 错误的原因。

当然,您可以使用“bar.baz” 字符串作为上述"bar.baz": 150的键(请不要!),但是您必须将值引用为
foo["bar.baz"]

这将明显不同于
foo.bar.baz;

总而言之,这只是为什么不能在键中使用.的一些基于直觉的推理,但真正的原因很明显是这样的:因为解析器将抛出错误。

09-30 16:02
查看更多