我正在用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对象,还是其他类似的东西?
答案 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
方法时,将执行以下步骤:
- 如果
this
值为undefined
,请返回"[object Undefined]"
。- 如果
this
值为null
,请返回"[object Null]"
。- 让
O
成为调用ToObject
传递this
值作为参数的结果。- 让
class
为O
的[[Class]]内部属性的值。- 返回串联三个字符串
醇>"[object "
,class
和"]"
的结果的字符串值。
不同之处在于my_object
的内部[[Class]]为"Object"
,但my_image
的内部[[Class]]为"HTMLImageElement"
。
因此,
HTMLImageElement
不会通过覆盖Object.prototype.toString
来生成自定义字符串,而是使用自定义[[Class]]。但是你不能使用相同的方法,至少在ECMAScript 5中是这样的:
8.6.2对象内部属性和方法
此规范未定义ECMAScript语言运算符或 允许程序修改对象的内置函数 [[Class]]或[[Prototype]]内部属性