js-----面向对象(一)

110 阅读2分钟

面向对象

面向对象 是一种对现实世界的理解和抽象的方法

研究范畴

  • 对象 万物皆对象 每个对象都具备自身的属性和功能
  • 类 抽象事物的特性和特点 把对象分成不同的类型 是一个描述一群事物共同特点的抽象概念
  • 实例 类中一个具体的个体 具有类所有的特性和功能

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