这里有一个关于覆盖toString
的问题,答案是:
function Foo() {}
Foo.prototype.toString = function()
{
return "this is Foo";
}
但我的问题是:
有没有办法把这个原型覆盖对象声明的INSIDE,如下所示:
function Foo() {
Foo.prototype.toString = function(){
return "this is Foo";
}
}
或者像这样:
var Foo = {
Foo.prototype.toString = function(){
return "this is Foo";
}
}
将原型放在对象声明之外真的很奇怪/烦人,但这可能是JavaScript的一个怪癖。我一直想知道这件事。
答案 0 :(得分:8)
正如Ted Hopp所提到的,没有其他方法可以做到这一点 。在ECMAScript 6中,您将能够使用class
语法,这只是构造函数和原型的语法糖:
class Foo {
toString() { ... }
}
对于对象文字,还会有一个简写:
var foo = {
__proto__: {
toString() {...}
}
};
特殊__proto__
声明允许您在对象文字内定义原型。但是,由于protoype只有在多个onjects shared 时才真正有用,所以在这种情况下直接将属性分配给对象会更简单,并且今天也可以使用:
var foo = {
toString: function() {},
};
答案 1 :(得分:3)
我想你正在寻找吼叫
function Foo() {
this.toString = function() {
return "this is Foo";
}
}
注意: - 这种方式的一个缺点是每次创建toString()
的新实例时都会重新创建方法Foo
。
答案 2 :(得分:3)
没有好办法做你想做的事。在评估声明之前,Function
对象Foo
(通常是对象构造函数)不存在,因此没有可用于分配toString
属性的原型。此外,toString
赋值不会被评估,直到构造函数至少执行一次。
在任何情况下,您都不希望在构造函数中初始化原型的toString
属性,因为这将为创建的每个Foo
实例分配一个新函数。您可以测试原型是否已经拥有自己的toString
属性,但这使得治疗方法比疾病更糟糕。坚持食谱。
答案 3 :(得分:1)
function Foo() {
return {
toString: function () {
return "this is foo";
}
};
}
var foo = new Foo();
console.log(foo.toString());
答案 4 :(得分:1)
没有办法做到这一点,因为当你在对象中引用Foo
时,Foo
尚未被声明。你可以尝试这样做。
var Foo = {}; //assign Foo to an empty object.
然后根据您的需要,使用Foo
和Object.defineProperties
向Object.assign
添加各种属性/方法。