在JavaScript中,Object对象默认定义了多个原型方法。由于继承关系,所有对象都将拥有这些方法。
Object基本方法 | 说明 |
---|---|
toString() | 返回对象的字符串表示 |
toLocaleString() | 返回对象的本地字符串表示 |
valueOf() | 返回对象的原始值 |
isPrototype() | 判定一个对象是否为另一个对象的原型 |
hasOwnProperty() | 检查属性是否被继承 |
prototypeIsEnumerable() | 判定是否可以通过for/in循环遍历对象的属性 |
使用toString()
toString()方法能够返回一个对象的字符串表示,它返回的字符串比较灵活,可能是一个具体的值,也可能是一个对象的类型标识。
对象实例与对象类型的toString()方法返回值是不同的。
function F(x,y){
this.x=x;
this.y=y;
}
var f=new F(1,2);
alert(f.toString());
alert(F.toString());
function Me(){}; //自定义数据类型
Me.prototype.toString=function(){ //自定义Me数据类型的toString()方法
return "[object Me]";
}
var me=new Me();
alert(me.toString());
alert(Object.prototype.toString.apply(me));
JavaScript在部分子类型中重写了toString()和toLocaleString()方法。例如:
在Array中重写toString(),让其返回数组元素值的字符串组合。
在Date中重写toString(),让其返回当前日期字符串组合。
在Number中重写toString()方法,让其返回数字的字符串表示。
在Date中重写toLocaleString()。让其返回当地格式化日期字符串。
使用valueOf()
valueOf()方法能够返回对象的值。
Object对象默认valueOf()方法返回值与toString()方法返回值相同,但是部分类型对象重写了valueOf()方法。
var o=new Date();
alert(o.toString());
alert(o.valueOf());
alert(Object.prototype.valueOf.apply(o));
function Point(x,y){
this.x=x;
this.y=y;
}
Point.prototype.valueOf=function(){
return "("+this.x+","+this.y+")";
}
var p=new Point(22,44);
alert(p.valueOf());
alert(Object.prototype.valueOf.apply(p));
检测私有属性
根据继承关系的不同,对象属性可以分为两类:私有属性和继承属性。
function F(){
this.name="私有属性";
}
F.prototype.name="继承属性";
var f=new F(); //实例化对象
alert(f.hasOwnProperty("name"));
alert(f.name);
凡是构造函数的原型属性(原型对象包含的属性),都是继承属性。
但是对于原型对象本身来说,这些原型属性又是原型对象的私有属性。
var d=Date;
alert(d.hasOwnProperty("toString"));
var d=Date.prototype;
alert(d.hasOwnProperty("toString"));
检测枚举属性
在大多数情况下,in运算符是探测对象中属性是否存在的最好途径。然而在某些情况下,可能希望仅当一个属性时才检查其是否存在。in运算符会检查私有属性和原型属性,所以不得不选择hasOwnProperty()方法。
var person={
'first-name':'zhang',
'last-name':'san',
sayName:function(){
document.write(this['first-name']+this['last-name']);
}
};
document.write('first-name' in person); //true
document.write(person.hasOwnProperty('first-name')); //true
document.write('toString' in person); //true
document.write(person.hasOwnProperty('toString')); //false
使用for/in循环可以遍历它的所有私有属性、原型属性。
function F(){
this.a=2,
this.b=4.
}
F.prototype.c=4;
F.d=11;
var o=new F();
for(var I in o){
document.write(I+"<br />"); // a b c
}
Object对象定义的propertyEnumerable()方法判定本地属性是否允许枚举。
document.write(o.propertyIsEnumerable("a")); //true
document.write(o.propertyIsEnumerable("b")); //true
document.write(o.propertyIsEnumerable("c")); //false
document.write(o.propertyIsEnumerable("d")); //false
var o=F;
document.write(o.propertyIsEnumerable("d")); //true
检测原型对象
在JavaScript中,Function对象预定义了prototype属性,该属性指向一个原型对象。当定义构造函数时,系统会自动创建一个对象,并传递给prototype属性,这个对象被称为原型对象。原型对象可以存储构造类型的原型属性,以便让所有实例对象共享。
var f=function(){}; //定义函数
f.prototype={ //函数原型对象
a:1,
b:function(){
return 11;
}
}
alert(f.prototype.a); //1
alert(f.prototype.b()); //11
var o=new f(); //实例对象
alert(o.a); //1
alert(o.b()); //11
Object对象定义了isPrototypeOf()方法检测一个对象的原型对象。
判断f.prototype是否为对象o的原型对象。
var s=f.prototype.isPrototypeOf(o);
alert(s); //true
判断其他特殊对象的原型对象。
var f=function (){};;
alert(Object.prototype.isPrototypeOf(f)); //true
alert(Function.prototype.isPrototypeOf(f)); //true
alert(Object.prototype.isPrototypeOf(Function)); //true
alert(Function.prototype.isPrototypeOf(Object)); //true
alert(Object.prototype.isPrototypeOf(Function.prototype)); //true
alert(Function.prototype.isPrototypeOf(Object.prototype)); //false
静态方法
在面向对象的编程中,类是不能够直接访问的,必须实例化后才可以访问。大多数方法和属性与类的实例产生联系。但是静态属性和方法与类本身直接联系,可以直接从类访问,也就是说静态成员是在类上操作,而不是在实例上操作。JavaScript核心对象中的Math和Global都是静态对象,不需要实例化就可以直接访问。
var F=(function(){ //把比包体(外层函数)赋值给变量F,返回一个构造函数(内存函数)
var _a=1; //比包体的私有变量
this.a=_a; //比包体内公共属性
this.get1=function(){ //比包体内公共方法get1()
return _a;
};
this.set1=function(x){ //比包体内公共方法set1()
_a=x;
};
return function(){ //返回的构造函数类
this.get2=function(){ //返回的公共方法get2()。可以访问私有变量
return _a;
};
this.set2=function(x){ //返回的公共方法set2()。可以访问私有变量
_a=x;
};
}
})(); //执行闭包体,返回匿名构造函数结构
F.get3=function(){
return get1(); //静态公共方法get3()
};
F.set3=function(x){
set1(x); //静态公共方法set3()
};
F.a=a;//静态公共私有属性a
var F=(function(){
function set5(x){ //静态私有方法
_a=x;
}
function get5(){ //静态私有方法
return _a;
}
})();
访问静态成员
alert(F.a); //1
alert(F.get3()); //1
F.set3(2);
alert(F.get3()); //2
F是返回的内层函数,该值是一个构造函数,无法访问外层函数的公共方法get1()和set1();但是可以访问返回构造函数体内的公共方法get2()和set2()。
var a=new F();
alert(a.get2()); //1
a.set2(3);
alert(a.get2()); //3