面向对象
面向对象 是一种对现实世界的理解和抽象的方法
研究范畴
- 对象 万物皆对象 每个对象都具备自身的属性和功能
- 类 抽象事物的特性和特点 把对象分成不同的类型 是一个描述一群事物共同特点的抽象概念
- 实例 类中一个具体的个体 具有类所有的特性和功能
JS中的内置类 都是函数数据类型
- Object
- Array
- Date
- RegExp
- Funtion
函数数据类型的检验 typeof
###单例模式 把一个事物的属性放到一个对象内这样的封装方式称为单例模式 变量只能代表一个值 后面的会覆盖前面的 为了解决覆盖问题 可以用对象 对象是用来描述 一个事物的 而对象的属性就是定性描述对象的特征 对象的属性值 是定量的描述事物的特征
var sta = {
name:'zhangsan',
age:18,
sex:'boy'
};
var sta2 = {
name:'lisi',
age:12,
sex:'boy'
}
优点
- 解决了全局变量相互覆盖的问题
高级单例 先执行一个自执行函数 在函数执行结束时 返回一个对象
var person = (function(){
function eat(food){
console.log(`I like ${food}`);
}
function hobby(h){
console.log(`I like ${h}`);
}
var name = 'zhangsan';
var age = '12';
var money = '$111';
return{
name;
age;
eat;
hobby;
}
})();
优点
- 可愿意在自执行函数的作用域中声明变量和函数 这个作用域不会销毁 可以最后返回对象里面选择导出哪些变量和方法供外界使用 不导出 外界拿不到 缺点:
- 有一个对象 我们就需要写一个对象 很繁琐 ###工厂模式 可以批量生产 把实现相同功能的函数封装成一个函数 当创建实例时 我们就执行这个函数 而且 每个对象都是单例
function arr(name,age,sex){
var obj = {}; //原材料
obj.name = name;
obj.age = age;
obj.sex = sex;
return obj; //出厂
}
let s =arr('zhangsan',12,'boy');
let s1 = arr('lisi',13,'girl');
优点
- 高内聚 低耦合 提高代码的复用率 缺点
- 这种方式生产的类 都是同一个类 没有分类
js的创建数据的方式
- 字面量创建
var obj = new Object{};
obj.name = 'zhangsan';
obj.age = 13;
obj.sex = 'girl';
consoel.log(obj);
- 实例创建
var obj = new reg('zhangsan',12,'girl');
consoel.log(obj);
构造函数模式 可以有类型的概念互补工厂模式 通过 new 调用一个函数,此时这个函数不再是普通函数,而是成为一个类,函数名称为类名,而通过 new 调用,自动返回这个类的一个实例。
调用方式
- 调用方式不同,构造函数只能通过new 操作符调用
- 工厂函数内 需要手动创建实例对象 而构造函数不需要手工创建对象 在构造函数被 new执行时 构造函数中的this自动和实例绑定 所有加工都发生在this上
- 工厂函数 需要手动返回对象实例 而构造函数在被new 操作符调用时不需要手动返回实例
function Student(name,age,subject,from){
this.name = name;
this.age = age;
this.subject = subject;
this.from = from;
this.miss = '努力学习';
this.learn = function(){
consoel.log(`${name}学习${subject}学科`);
}
}
//创建一个实例
let Mayun = new Student('zhangsan',13,'java');
let lisan = new Student('lisi',18,'数据库','学校');
//通过浏览器控制台查看 这两个实例的前面出现了Student
因此Mayun lisan都属于Student类的实例
instanceof 运算符 检验当前对象是否是当前类型的实例 返回true 或者 false
lisan instanceof Student
因为Object是基类 所有实例都是对象数据类型 所以用 instanceof检验是否是Object实例 都会返回true