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属性是否可枚举
posted @ 2020-06-22 20:43  飘逸_winxin  阅读(223)  评论(0编辑  收藏  举报