Object的prototype属性对象在ES5.1和ES2015中都规定constructor、toString()、toLocaleString()、valueOf()、hasOwnProperty(V)、isPrototypeOf(V)、propertyIsEnumerable(V)
7个属性,其中,constructor会默认指向创建对象的function,其他6个是方法
- toString:将对象转换为字符串,不同类型的对象可能会重写自己的toString方法。
比如,Array的toString方法会将其所包含的元素使用逗号连接起来组成字符串并返回、Date的toString方法会返回Date的时间字符串等,普通object类型对象会返回[object Object]
- toLocaleString:会使用本地化格式来生成字符串,对于时间日期类型和数字类型的作用比较大
- valueOf:会返回原始值。
比如,因为Date类型对象是通过数字来保存的,所以当Date类型对象调用valueOf时就会获得相应的数字。
- hasOwnProperty:判断是否包含指定属性。注意,这里判断的对象自身是否包含指定的属性,不包括创建对象的function对象的protype中的属性。
- isPrototypeOf:判断是否是另一个对象所对应的prototype对象。
- propertyIsEnumerable:判断某个属性是否可以枚举。
function log(msg){
console.log(msg);
}
var array=[1,3,5];
var date=new Date();
log(array.toString()); //1,3,5
log(date.toString()); //Tue Feb 19 2019 14:08:54 GMT+0800 (中国标准时间)
log(date.toLocaleString()); //2019/2/19 下午2:08:54
log(date.valueOf()); //1550556534688
var Obj=function(){
this.msg="hello";
this.say=function(){
log(msg)
}
}
var proto={color:"red"};
Obj.prototype=proto;
var obj=new Obj();
log(obj.constructor); //ƒ Object() { [native code] }
log(obj.hasOwnProperty("msg")); //true
log(obj.hasOwnProperty("lolor")); //false
log(obj.propertyIsEnumerable("msg")); //true
log(obj.isPrototypeOf(proto)); //false
log(proto.isPrototypeOf(obj)); //true
需要注意,因为将Obj的prototype属性赋值为proto对象,所以创建的obj对象在调用constructor属性时就不会反悔Obj对象而是返回Object对象。可以通过对proto对象进行修改来修复这个问题
var proto={color:"red"};
proto.constructor=Obj;
Obj.prototype=proto;
var obj=new Obj();
console.log(obj.constructor);
这就可以正确地输出constructor了。
除标准中规定的Object的prototype属性对象中的7个属性外,不同浏览器还会有一些自己的扩展。如:Firefox中扩展到14个属性:consturctor、toSource、toString、toLocaleString、valueOf、watch、unwatch、hasOwnProperty、isPrototypeOf、propertyIsEnumerable、_ _defineGetter_ _、_ _defineSetter_ _、_ _lookupGetter_ _、_ _lookupSetter_ _
。但是并非通用属性,其它浏览器中可能没有定义,如果使用很可能造成不兼容的问题。