我想向内部类的原型(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;
总而言之,这只是为什么不能在键中使用
.
的一些基于直觉的推理,但真正的原因很明显是这样的:因为解析器将抛出错误。