1.创建一个对象
创建一个Cat类:
function Cat()
{
}
//如果这样用
//Cat(); //Cat是函数
var cat1 = new Cat();
cat1.name = "小白";
cat1.age = 3;
cat1.color ="白色";
从上面的代码可以看出:
JS中对象的属性可以动态的添加;
对象的属性的数据类型没有限制。
特别说明:在JS中一切都是对象,类(如上面的Cat类)其实也是对象,它实际上是function类的一个实例,通过类,我们可以创建自己的对象实例。
对于比较简单的对象,也可以这样创建:
var dog = {name: "小明",sayHello:function(a,b){window.alert("结果 = " + (a+b));}}
window.alert(dog.name);
window.alert(dog["name"]);
dog.sayHello(200,50);
这样创建对象时,实际上是系统调用了Object类。
2.如何使用对象实例的成员变量
1.对象实例名.属性名;
2.对象实例名[“属性名”],此方法可以实现动态的访问变量。
function Person()
{
}
var p1 = new Person();
p1.name = "cuizhiquan";
window.alert(p1.name);
var val = "na" + "me";
window.alert(p1[val]); //实现动态访问
delete p1.name; //删除p1对象的name属性
3.this关键字
通过上面的方法,每创建一个对象实例后,动态的添加属性,该属性只被该对象实例拥有,其他对象实例并不能拥有该属性,在实际编程中,我们可能有这样的需求,当我们创建一个对象后,就希望该对象自动拥有某些属性,这时我们就会用到this关键字。
function Person()
{
this.name = "abc";
this.age = 90;
}
var p1 = new Person();
var p2 =new Person();
p2.name = "cuizhiquan";
通过这种方式,创建对象实例p1、p2后,p1、p2自动拥有name和age属性,当给p2的name属性赋值"cuizhiquan"后,会覆盖掉创建类时name属性的初始值“abc”。
不能像下面这样定义类的属性:
function Person()
{
var name = "abc";
var age = 90;
}
这样name和age只能称为在类或函数Person内定义的普通局部变量,出了类或函数的花括号,将不能被访问。
this关键字的另一个作用就是指向当前对象,类似于Java。
4.创建成员函数的四种方法
1、使用this关键字
function Person()
{
var name = "abc";
var age = 900;
this.show=function()
{
window.alert(name+" "+age);
}
}
var p1 = new Person();
p1.show();
2.外部定义函数后,动态绑定到对象实例
function Person()
{
this.name = "abc";
this.age = 900;
}
function show()
{
window.alert(name+" "+age);
}
var p=new Person();
p.abc=show;
p.abc();
3.在动态绑定时,定义函数
function Person()
{
this.name = "abc";
this.age = 900;
}
var p = Person();
p.abc = function show()
{
window.alert(name+" "+age);
}
p.abc();
4.原型法
前面三种方法存在问题,第一种方法,每个对象都有相同的一段函数代码,这样如果对象很多,则会影响效率,第二种和第三种方法给对象实例绑定了相应方法后,只有该对象实例具有该方法,其他对象实例如果需要该方法还需再次绑定,这样绑定了该方法的对象实例,都会分别拥有一段相同的代码,如果对象很多,也会影响效率,原型法用来解决这个问题:
function Dog()
{
}
var dog1 = new Dog();
Dog.prototype.shout=function()
{
window.alert("小狗");
}
dog1.shout();
var dog2 = new Dog();
dog2.shout();
通过上面的原型法,shout方法,会被放在代码区,让所有对象实例共享,提高效率。
5.Object类
Object类是所有JavaScript类的基类,提供了一种创建自定义对象的简单方式,不需要程序员再定义构造函数:
var p = new Object();
p.name = "cuizhiquan";
Object类的主要属性:
- constructor:对象的构造函数;
- prototype:获得类的prototype对象。
Object类的主要方法:
- hasOwnProperty(property):是否属于本类定义的属性;
- isPrototypeOf(object):是否是指定类的prototype;
- propertyIsEnumerable(property):是否是可列举的属性;
- toString():返回对象对应的字符串;
- valueOf():返回对象对应的原始类型值。
6.构造函数
构造函数是一种特殊的方法,它的主要作用是完成对对象实例的初始化。它有几个特点:
- 构造函数名和类名相同;
- 在创建一个对象实例时,系统会自动的调用该类的构造方法完成对新对象的初始化。
function jisuan(num1,num2,oper)
{
if(oper == "+")
{
return num1+num2;
}else if(oper == "-")
{
return num1-num2;
}else if(oper == "*")
{
return num1*num2;
}else
{
return num1/num2;
}
}
function Person(name,age,fun)
{
this.name = name;
this.age = age;
this.fun = fun;
}
var p = new Person("aa",90,jisuan);
window.alert(p.name + " " + p.age);
window.alert(p.fun(200,50,+));
7.对for...in 的进一步认识
for...in 不仅可以遍历数组,而且可以列出对象的所有属性和方法,例如下面的代码列出window对象的所有属性和方法:
for(var key in window)
{
document.writeln(key+":"+window["key"]+"<br/>")
}