这里主要讲解各种对象的注意事项:
1. 对象的声明:
有两种:
var a=new Object();
或者
var a={
name="aa"
}
第一种简明式的和第二种直接式的。其赋值是方式是:
对象名.属性=值
a.value=12
a.name="aaa”
等等
2. 对象是引用类型,且会互相引用
如,var a={
a.name="aa"
}
var b=a;//将a对象赋值给b
alert(b.name)
这里会返回"aa",表示b引用了a。然而问题不是这个,当我们更改b的属性:
b.name="bb"
然后:alert(a.name)
会发现,返回的竟然是"bb"
这就意味着,将a赋值给了b,b也能对a的值进行操作。
【这是因为ab属于引用,它们指向的是同一组数据,就像假设a是一个桥,通向对面,现在b复制了这座桥,它也能通向对面了。同时,通过b桥的人对对面进行了一些操作和通过a桥对对面进行操作本质上没有区别,都会对对面产生影响。】
3. 对象中的this
var name = ‘The Window‘;
var object = {
name:‘My Object‘,
getNameFunc:function(){
//var that=this;
return function(){
//把this所指代的对象使用 变量that保存起来,这样即使运行环境发生了改变,that所指代的对象也不会变化
return this.name;
}
}
}
alert(object.getNameFunc()());
this作为js的关键字,有特殊的含义,代表了当前对象,而当前对象是谁,是由函数执行时所处的环境来决定
当环境改变时,this所指代的对象也可能会发生变化
4. 构造函数
function Human(username, age){
this.username=username;
this.age=age;
this.talk=new Function("alert(this.username+‘,‘+this.age)");
}
如上面就是一个简单的构造函数,通过这个函数就可以简单的创造对象了:
var a=new Human("aa",13)
a.talk();
可以返回一个结果出来。
而且,这个函数可以反复利用,创造多个不同对象,对象之间没有干扰。
var a=new Human("aa",13)
var b=new Human("bb",13)
var c=new Human("cc",13)
5 原型 prototype
function Human(username, age){
this.username=username;
this.age=age;
this.talk=new Function("alert(this.username+‘,‘+this.age)");
}
Human.prototype.ww="yahaha"
外部增加属性的方法,这个属性被所有实例公用。
var a=new Human("aa",13)
var b=new Human("bb",13)
var c=new Human("cc",13)
alert(aa.ww)
alert(bb.ww)
6. 对象操作
function Human(username, age){
this.username=username;
this.age=age;
this.talk=new Function("alert(this.username+‘,‘+this.age)");
}
var a=new Human("aa",13)
alert(aa.age)
delete a.age
alert(aa.age)
会发现第一个有反应回复13,第二个就是undefine了。表示这个属性已经被删除了。
7. js的继承
1 prototype 这里所谓的继承(比较特殊的继承),他是所有实例对象共享属性,并且构造函数不能传参。
2 call 使用父类函数的call (子类对象,参数1,参数2,参数3......) 是最常用的
3 apply 使用父类函数的apply (子类对象,[参数1,参数2,参数3.....])
function Human(username, age){
this.username=username;
this.age=age;
this.introduce=function(){
alert(this.username+this.age);
}
this.sex=‘男‘;
}
function Student(username, age, score){
调用父类构造函数进行传参
Human.call(this, username, age);
this.score=score;
this.username=username;
}
function Teacher(username, age){
Human.apply(this, [username, age])
}
Student.prototype = new Human(‘www‘);//只是拷贝Human的属性和方法
Teacher.prototype = new Human();
哪怕你这么写了:
Teacher.prototype = new Human(“aaa",13);
alert(Teacher.age)
也是undefine
只有重新赋值之后才能使用;
Teacher.age=14
alert(Teacher.age)