对象的toString方法从哪里获取其值?

时间:2015-02-15 15:31:53

标签: javascript class inheritance prototype

我正在用JavaScript编写一些自定义类,我希望他们的toString方法返回一个反映类本身而不是Object类的值。例如:

function MyClass(){}

var my_object=new MyClass();
alert(my_object);// Returns "[object Object]"

如果我实例化HTMLImageElement,结果会有所不同:

var my_image=new Image();
alert(my_image);// Returns "[object HTMLImageElement]"

我可以覆盖我的自定义类的toString方法,如下所示:

MyClass.prototype={
    toString:function(){
        return "[object MyClass]";
    }
};

覆盖toString方法允许我获得反映我的类名的结果,但我觉得这种方法与HTMLImageElement使用的方法不同。是吗?有没有办法改变toString的结果而不在原型中覆盖它?是否像HTMLImageElement这样的类实际构建了JavaScript对象,还是其他类似的东西?

1 个答案:

答案 0 :(得分:1)

使用时......

function MyClass(){}
var my_object = new MyClass();

... my_object.toString继承自Object.prototype

my_object.hasOwnProperty('toString');                      // false
MyClass.prototype.hasOwnProperty('toString');              // false
Object.prototype.hasOwnProperty('toString');               // true
/* => */ my_object.toString === Object.prototype.toString; // true

对于Image个实例,他们也会从toString继承Object.prototype

var my_image = new Image();
my_image.hasOwnProperty('toString');                      // false
HTMLImageElement.prototype.hasOwnProperty('toString');    // false
HTMLElement.prototype.hasOwnProperty('toString');         // false
Node.prototype.hasOwnProperty('toString');                // false
EventTarget.prototype.hasOwnProperty('toString');         // false
Object.prototype.hasOwnProperty('toString');              // true
/* => */ my_image.toString === Object.prototype.toString; // true

Object.prototype.toString定义为

  

15.2.4.2 Object.prototype.toString()

     

调用toString方法时,将执行以下步骤:

     
      
  1. 如果this值为undefined,请返回"[object Undefined]"
  2.   
  3. 如果this值为null,请返回"[object Null]"
  4.   
  5. O成为调用ToObject传递this值作为参数的结果。
  6.   
  7. classO的[[Class]]内部属性的值。
  8.   
  9. 返回串联三个字符串"[object "class"]"的结果的字符串值。
  10.   

不同之处在于my_object的内部[[Class]]为"Object",但my_image的内部[[Class]]为"HTMLImageElement"

因此,

  • 不,HTMLImageElement不会通过覆盖Object.prototype.toString来生成自定义字符串,而是使用自定义[[Class]]。
  • 但是你不能使用相同的方法,至少在ECMAScript 5中是这样的:

      

    8.6.2对象内部属性和方法

         

    此规范未定义ECMAScript语言运算符或   允许程序修改对象的内置函数   [[Class]]或[[Prototype]]内部属性