一 面向对象概念
程序设计方法:
面向过程:以过程为中心,自顶向下逐步细化。看成一系列函数的调用。
面向对象:对象作为基本单元,程序分解为数据和相关操作。概念和特性:
概念:对象,类,属性,方法。
特性:继承,封装,多态。
二 constructor 对象构造器
概念:
1
var o = new Array(); // var 对象 = 对象构造器;
使用函数来构造自定义的构造器:
1
2
3
4
5
6
7
8
9
10
11
12function Student(name,class,score)
{
this.name = name;
this.class = class;
this.score = score;
this.changeScore = function(score) // 函数类型的属性即方法。
{
this.score = score;
};
}
var student1 = new Student('Amy','2','98');注意:如果构造函数有返回值
return{}
则得到的是一个空对象,undefined。
三 this
- 全局环境中的 this:
1
2var a = 10;
alert(this.a);
this 指向全局对象(在浏览器中是 window 对象,其他环境不同)。
constructor 中的 this:
指将要创建出来的新的对象。函数中的 this:
1
2
3
4
5
6
7
8
9
10
11
12function Person(name,age)
{
this.name = name;
this.age = age;
this.sayHello = function()
{
alert('hello,'+this.name); // 指向函数调用者 p1。
}
}
var p1 = new Person('lily','20');
p1.sayHello();var o = new Function('alert(this)');
中的 this:
和全局中的 this 一样,指全局对象。eval() 中的 this:
eval('alert(this)');
指代调用上下文中的 this。小结:
apply 和 call:
改变其他构造函数中方法的 this 指代,改为参数中的对象。1
2
3
4point.move(1,1); // 其他对象方法
point.move.call(circle,1,1); // 想使用其他对象的方法
point.move.apply(circle,[1,1]);
四 原型继承
prototype,让创建的对象共享一个原型的值,不浪费空间(生成多个占用不同空间的值)。1
2
3
4
5
6
7
8
9
10
11
12function Teacher(){
this.course = [];
}
Teacher.prototype = {
job: 'teacher',
setName: function(name){
this.name = name;
},
addCourse: function(course){
this.course.push(course);
}
}
五 原型链
1 属性查找
在对象本身中找,没有则去其原型中找,没有再去 Object.prototype 中查找。
2 属性修改
永远只修改对象本身的属性,不管名字来源于对象本身还是其原型。
和原型上的属性相同只会在对象本身上创建一个属性,想修改原型的属性值必须用 Teacher.prototype.job = 'XXX';
3 属性删除
与修改类似,删除只能删除对象本身的属性,无法删除原型的属性。
1
2delete teacher1.job;
//删除对象 teacher1 上的 job 属性。如果这时访问该属性会去原型找到。用
techer1.hasOwnProperty('job');
来判断其属性是否来自它本身(true)还是其原型(flase)。ES5 中的原型继承:
直接从原型中创建一个对象,Object.create(proto[,propertiesObject])
。
eg.var teacher2 = Object.create(teacher);
六 应用
1 全局变量
- 全局变量的三种定义:
- 在最外面定义
var test = 'some value';
- window.变量名字
window.test = 'some value';
- 在程序内内直接给一个变量赋值,但不用 var 定义。
后两种定义在 window 对象上,可以用 delete 删除。
- 其他两种全局变量情况:
2 封装
信息隐藏:
Java 中的封装权限:
JavaScript 中的封装:
3 继承
原型继承:
类继承。原型继承结构: