在对象声明中覆盖toString原型

时间:2014-12-23 04:07:20

标签: javascript node.js

这里有一个关于覆盖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的一个怪癖。我一直想知道这件事。

5 个答案:

答案 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.

然后根据您的需要,使用FooObject.definePropertiesObject.assign添加各种属性/方法。