面向对象编程:OOP
面向对象编程:OOP
class 类
1. JavaScript没有class (ES5)
JavaScript的面向对象是一种非正统的怪异的面向对象
2. 使用Function来模拟对象
3.对象:
一切皆对象
对象包含:属性 方法
属性:特性 变量
方法:功能 函数
4.JavaScript内置对象
Date Array Function RegExp Object
5.自定义对象
Object
举例:
var book=new Object();//创建一个对象实例
//添加属性
book.name='JavaScript入门';
book.page=300;
//添加方法
book.read=function () {
console.log('阅读');
};
//访问对象的属性
document.write(book.name,book.page);
//方法
book.read();
创建一个学生对象 学号、姓名、年级、年龄
学习,跑步
代码如下:
var stu=new Object();//创建学生对象
//添加属性
stu.id=1000;
stu.name='Jack';
stu.grade='二年级';
stu.age=22;
//添加方法
stu.study=function () {
// console.log(stu.name+'学习');
console.log(this.name+' 学习');
};
stu.run=function(){
console.log(this.name+' 跑步ing....');
};
//访问属性和方法
console.log(stu.id,stu.name,stu.age,stu.grade);
stu.study();
stu.run();
录入班级学生(姓名、年龄、学号),当遇到exit时结束录入,输出所有学生的学号、姓名和年龄
var arr=getData();//录入数据
showData(arr);//输出数据
//录入数据
function getData() {
var arr=[];//数组
while(true){
var res=prompt('结束录入,请输入exit:');
if(res=='exit'){
break;
}
var stu=new Object();//创建对象
stu.name=prompt('请输入姓名:');
stu.age=prompt('请输入年龄:');
stu.no=prompt('请输入学号:');
//保存对象
arr.push(stu);
}
return arr;
}
//输出数据
function showData(arr){
arr.forEach(function(item){
console.log(item.no,item.name,item.age);
});
}
工厂模式创建对象
优点:方便,能够批量产生对象
缺点:为每一个新对象都追加了新方法,内存浪费
//创建 猫 对象
function createCat(name,age,color) {
var cat=new Object();
cat.name=name;
cat.age=age;
cat.color=color;
cat.catchMouse=function () {
console.log(this.name+' 抓到一只大老鼠') ;
};
return cat;
}
//创建 猫 对象实例的过程
var cat1=createCat('小花',2,'梅花色');
console.log(cat1.name,cat1.age,cat1.color);
cat1.catchMouse();
var cat2=createCat('小黄',2,'黄色');
console.log(cat2.name,cat2.age,cat2.color);
cat2.catchMouse();
console.log(cat1.catchMouse==cat2.catchMouse);//false
构造函数
//模板
//构造函数
优点:能够批量创建对象 简洁
缺点:依然为每一个新对象都生成新的方法,内存浪费
当构造函数被new的时候,系统做了如下事情:
1.创建一个object对象 new Object();
2.将对应的属性和方法绑定到obj
3.将该对象返回
function Person(name,age) {
//添加属性
this.name=name;
this.age=age;
//添加方法
this.run=function(){
console.log(this.name+' is runing,.....');
};
this.say=function(){
console.log(this.name+' is speaking....');
};
}
//根据构造函数创建对象实例
var s=new Person('Lucy',21);
console.log(s.name,s.age);
s.run();
s.say();
var s1=new Person('Lily',22);
console.log(s1.name,s1.age);
s1.run();
s1.say();
录入班级学生(姓名、年龄、学号),当遇到exit时结束录入,输出所有学生的学号、姓名和年龄
这个题用构造函数写一下:
var arr=getData();//录入数据
showData(arr);//输出数据
//录入数据
function getData() {
var arr=[];//数组
while(true){
var res=prompt('结束录入,请输入exit:');
if(res=='exit'){
break;
}
var name=prompt('请输入姓名:');
var age=prompt('请输入年龄:');
var no=prompt('请输入学号:');
var stu=new Student(no,name,age);//创建对象
//保存对象
arr.push(stu);
}
return arr;
}
//输出数据
function showData(arr){
arr.forEach(function(item){
console.log(item.no,item.name,item.age);
});
}
//创建学生
function Student(no,name,age){
this.no=no;
this.name=name;
this.age=age;
}