我想在内部类的原型中添加一个方法。这可能吗?
这就是我的尝试:
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。
答案 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
属性。