JavaScript使用对象笔记4:使用方法(JavaScript)

在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值