zoukankan      html  css  js  c++  java
  • js-面向对象编程基础

    1.OOP

    面向对象编程(Object Oriented Programming,缩写为OOP)是目前主流的编程范式。它的核心思想是将真实世界中各种复杂的关系,抽象为一个个对象,然后由对象之间的分工与合作,完成对真实世界的模拟

    面向对象编程的基本特点是:封装,继承,多态

    • 封装:封装的过程就是把一些属性和方法放到对象中“包裹”起来
    • 继承:继承,简单的说就是可以从父级那里获取到共有的属性和方法
    • 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,由于弱类型的特点,JS自带多态,或者说不需要这个概念

    2.对象创建

    对象是一种复杂的引用类型,拥有属性和方法

    字面量创建

    var obj = {a:1, b:2};
    

    构造函数创建

    var obj = new Object([value]);                // 将value转换成对象
    

    以某个对象作为原型创建

    var obj1 = Object.create(obj);              // obj1将继承obj的所有属性和方法
    

    3.万物皆对像

    在js中,万物皆对象,万物皆对象指的是:js中所有的数据类型的顶层,都是Object的原型

    数字是对象

    字符串是对象

    布尔值是对象

    元素是对象

    4.原型 __proto__

    5.原型链

    任何一个对象都是原型和原型连接形成链式结构,这种链式结构叫做原型链,原型链的顶端都是Object的原型,原型链通过__proto__连接,以下是div元素的原型链

    HTMLDivElement-->HTMLElement-->Element-->Node-->EventTarget-->Object

    Object的原型是所有对象的原型,所有的对象都继承于Object的原型,所有的对象都拥有Object原型上的方法

    6.对象属性的读取和设置

    对象有两种属性,一种是自身的对象属性,另一种是自身原型的对象属性,自身的对象属性简称对象属性,自身原型的对象属性简称为原型属性。在对象获取属性是遵循以下原则

    先查看对象属性是否存在,如果存在直接读取该属性,如果对象属性不存在,就根据原型链依次从最近的原型属性逐级向上查找,直到找不到结果为undefined,在对象属性设置时,只能设置对象属性而不能设置原型属性

    7.对象的属性

    对象的每个属性都拥有描述对象,用来控制一个对象的属性是否可写,是否可枚举,是否可删除,描述对象包含以下四个属性

    • value:属性的值
    • writable:是否可写,默认为true,改成false则属性只可读,不可写
    • enumerable:是否可枚举,默认为true,改成false则该属性不可被遍历
    • configurable:是否可配置,可删除,默认为true,改为false则该属性不可被删除,不可再配置(排除将writable从true改为false,writable为true时修改value)

    Object.defineProperty(obj, prop, config)

    描述对象中属性不写则表示值为false

    Object.defineProperty(obj, 'name', {
        value: 'value',
        configurable: false,    // 不可再配置
        writable: true,         // 可写
        enumerable: true        // 可枚举
    });
    

    Object.defineProperties(obj, configObj)

    描述对象中属性不写则表示值为false

    Object.defineProperties(obj, {
        a: {
            value: 10
        },
        b: {
            enumerable: true,
            value: 20
        },
        c: {
            configurable: true,
            value: 30
        }
    })
    

    Object.getOwnPropertyNames(obj)

    获取对象的所有属性名,不管属性是否可枚举,组成数组并返回

    Object.getOwnPropertyDescriptor(obj, prop)

    获取对象指定属性名的描述对象并返回

    Object.getOwnPropertyDescriptors(obj)

    获取对象所有属性名的描述对象并返回

    8.对象的静态方法

    Object.assign

    对象属性合并方法

    // 对象复制的两种方法
    var obj = {a:1, b:2};
    // 循环复制
    for(var prop in obj) {
        o[prop] = obj[prop];
    }
    // 解构复制
    var obj1 = {...obj};
    

    Object.assign复制,将obj对象的所有属性复制到一个空对象上并返回这个空对象

    var obj2 = Object.assign({}, obj);
    

    当参数为多个对象时,将所有对象的所有属性复制到空对象,同名属性的值,以参数列表中靠后的对象属性的值决定,Object.assign不能复制原型链,不可枚举属性,以上的三种方法全是浅复制方法,只能复制到对象的第一层,JSON方法可以将对象进行深复制,不过同样无法复制不可枚举属性,同时不会复制方法

    var obj = {a:1, b:2};
    var obj1 = JSON.parse(JSON.stringify(obj));         // 深复制对象
    

    Object.keys(obj)

    将可枚举的属性组成数组并返回

    Object.values(obj)

    将可枚举的属性的值组成数组并返回

    Object.freeze(obj)

    冻结对象,被冻结的对象不可修改属性,不可删除属性,也不可添加属性

    Object.isFronzen(obj)

    判断对象是否被冻结

    Object.isExtensible(obj)

    判断对象是否可以扩展,添加新属性

    Object.is(a,b)

    判断两个值是否相同,和===类似,但不完全相同

    console.log(-0 === +0);             // true
    console.log(Object.is(-0, +0));     // false
    console.log(NaN === NaN);           // false
    console.log(Object.is(NaN, NaN));   // true
    

    9.对象的原型方法

    hasOwnProperty

    判断属性是否为对象的对象属性而不是原型属性

    obj.hasOwnProperty('name');         // 判断name是否为obj的对象属性
    

    isPrototypeOf

    判断一个对象是否为另一个对象的原型

    o.isPrototypeOf(obj);               // 判断o是否为obj的原型对象
    

    propertyIsEnumerable

    判断对象上的某个属性是否可枚举

    obj.propertyIsEnumerable('name');   // 判断obj的name属性是否可枚举
    
  • 相关阅读:
    Mysql将查出的一列数据合并为一行
    删除ArrayList的元素
    实体类Data时间限制
    java 生成随机数 自定义
    js 数组 删除第一个和最后一个
    Mybatis 返回值 返回Map的为空的值
    POI导出excel
    Objective-C 协议(接口)
    Objective-C 字典、可变字典
    Objective-C 数组、可变数组
  • 原文地址:https://www.cnblogs.com/piaoyi1997/p/13179031.html
Copyright © 2011-2022 走看看