JavaScript:将原型方法添加到内部类

时间:2015-06-20 14:17:31

标签: javascript node.js 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不起作用,它会抛出一条带有消息Unexpected token .的SyntaxError。

2 个答案:

答案 0 :(得分:3)

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

试试这个:

.

虽然存在轻微的语义差异,因为这样你就不会覆盖原型,只是扩展原型。 (首先考虑将其等同于var Foo = function Foo() {}; Foo.prototype.Bar = function Bar() { }; Foo.prototype.Bar.prototype = { barMethod: function () { console.log('hello'); } }; ,然后使用您尝试创建的对象的每个属性对其进行扩展)

(*)关于歧义的说明:我在上面提到在对象键中使用{}会产生歧义,这是一个简单的例子:

.

如果上面的代码不会引发错误,您希望var foo = { bar: { baz: 0, qux: 20 }, bar.baz: 150 //note that this will throw an error }; console.log(foo.bar.baz); 打印什么,0或150?

这就是在密钥中使用console.log(foo.bar.baz)没有意义的原因,这就是解析器在任何.上抛出意外令牌错误的原因。

当然,你可以使用“bar.baz”字符串作为上面.的密钥(请不要!),但是你必须将值引用为

"bar.baz": 150

明显不同
foo["bar.baz"]

总而言之,这只是一些基于直觉的推理,背后为什么你不能在你的密钥中使用foo.bar.baz; ,但真正的原因很明显:因为解析器会抛出一个错误。

答案 1 :(得分:1)

在对象文字中,您只能定义该对象文字的属性,而不能定义值的属性。

但是,如果您想在创建对象时设置prototype,请考虑Object.assign(可以是polyfilled):

Foo.prototype = {
  Bar: Object.assign(function Bar() { }, {
    prototype: {
      barMethod: function () {
        console.log('hello');
      }
    }
  }),
  fooMethod: function () {
    var bar = new this.Bar();
    bar.barMethod();
  }
};

但是,请注意,替换所有原型是一种不好的做法,因为您删除了constructor属性。