对象的种种

这里主要讲解各种对象的注意事项:

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)

原文地址:https://www.cnblogs.com/thestudy/p/5638256.html