一、对象创建方式
1) 对象初始化器方式
格式:objectName = {property1:value1, property2:value2,…, propertyN:valueN} ,可以想象为一个HashMap;这里其实是JSON数据类型
property是对象的属性
value则是对象的值,值可以是字符串、数字或对象三者之一
例如:
<html>
<head>
<title>test</title>
<script type="text/javascript">
function test() {
var user = {
name : "user1",
age : 18,
getName : function() {
return this.name;
}
}
alert(user.name);//直接取对象的属性值
//或者用下面这样也可以取值
alert(user['name']);
alert(user.getName());//调用方法
}
</script>
</head>
<body οnlοad="test()"></body>
</html>
2) 函数方式
包含的方式比较多,流行的是构造函数/原型方式 ,当然也可看看jquery和extjs的源码看看别人都再用什么样的方式。
a. 工厂方式;
b. 构造函数方法;
c. 原型方式;
d. 混合的构造函数/原型方式;
e. 动态原型方法;
f. 混合工厂方式;
举一个简单例子:
<html>
<head>
<title>test</title>
<script type="text/javascript">
//定义对象User;采用“构造函数方法”
function User1(name) {
this.name = name;
this.getName = function() {
return this.name;
}
}
//定义对象User2;采用“原型方式”
function User2() {};
User2.prototype.name ="hello world";
User2.prototype.setName = function(name) {
this.name = name;
}
User2.prototype.getName = function() {
return this.name;
}
//测试
function test() {
//创建对象实例
var user = new User1("name1");
alert(user.name);
alert(user.getName());
var user2 = new User2();
user2.setName("name2");
alert(user2.name);
alert(user2.getName());
}
</script>
</head>
<body οnlοad="test()"></body>
</html>
详细可参看http://www.cnblogs.com/QiuYun/archive/2007/03/22/684523.html
二、对象的属性
JS中可以为对象定义三种类型的属性:私有属性、实例属性和类属性,与Java类似,私有属性只能在对象内部使用,实例属性必须通过对象的实例进行引用,而类属性可以直接通过类名进行引用。
1) 私有属性定义
私有属性只能在构造函数内部定义与使用。
语法格式:var propertyName=value;
例如:
function User(age){ this.age=age; var isChild=age<12; this.isLittleChild=isChild; } var user=new User(15); alert(user.isLittleChild);//正确的方式 alert(user.isChild);//报错:对象不支持此属性或方法
2) 实例属性定义,也存在两种方式:
prototype方式,语法格式:functionName.prototype.propertyName=value
this方式,语法格式:this.propertyName=value,注意后面例子中this使用的位置,
上面中value可以是字符创、数字和对象。
3) 类属性定义
语法格式:functionName.propertyName=value
例如:
function User(){ } User.MAX_AGE=200; User.MIN_AGE=0; alert(User.MAX_AGE);
4) 对于属性的定义,除了上面较为正规的方式外,还有一种非常特别的定义方式,
语法格式: obj[index]=value
例如:
function User(name){ this.name=name; this.age=18; this[1]=“ok”; this[200]=“year”; } var user=new User(“user1”); alert(user[1]);
在上面例子中,要注意:不同通过this[1]来获取age属性,也不能通过this[0]来获取name属性,即通过index方式定义的必须使用index方式来引用,而没有通过index方式定义的,必须以正常方式引用
三、属性与方法的动态增加和删除
1) 对于已经实例化的对象,我们可以动态增加和删除它的属性与方法,语法如下(假定对象实例为obj):
动态增加对象属性
obj.newPropertyName=value;
动态增加对象方法
obj.newMethodName=method或者=function(arg1,…,argN){}
动态删除对象属性
delete obj.propertyName
动态删除对象方法
delete obj.methodName
例如
<html>
<head>
<title>test</title>
<script type="text/javascript">
//定义对象User;采用“构造函数方法”
function User1(name) {
this.name = name;
this.getName = function() {
return this.name;
}
}
//测试
function test() {
//创建对象实例
var user = new User1("name1");
alert(user.getName());
//动态添加新属性和方法
user.age = 10;
user.setAge = function(age){
this.age = age;
}
user.getAge = function() {
return this.age;
}
alert(user.getAge());
delete user.name;
delete user.getName;
//当然出此作用域后动态添加的方法就没有了
alert(user.name);//显示undefined
test2();
}
function test2() {
var user = new User1("name2");
alert(user.getName());
}
</script>
</head>
<body οnlοad="test()"></body>
</html>