标题你知道万物,但你知道万物皆对象吗?
● 面向对象编程(Object Oriented Programming,缩写为OOP)是目前主流的编程范式。它的核心思想是将真实世界中各种复杂的关系,抽象为一个个对象,然后由对象之间的分工与合作,完成对真实世界的模拟
基本特点是:封装,继承,多态
● 封装:封装的过程就是把一些属性和方法放到对象中“包裹”起来
● 继承:继承,简单的说就是可以从父级那里获取到共有的属性和方法
● 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,由于弱类型的特点,JS自带多态,或者说不需要这个概念
基本概念: 万物皆对象 任何一个对象都是原型和原型连接形成链式结构,这种链式结构叫做原型链,原型链的顶端都是Object的原型,原型链通过__proto__连接,以下是div元素的原型链
HTMLDivElement --> HTMLElement --> Element --> Node --> EventTarget --> Object
对象有两种属性,一种是自身的对象属性,另一种是自身原型的对象属性,自身的对象属性简称对象属性,自身原型的对象属性简称为原型属性,绑定在Object原型上的方法和属性会被所有的对象共享和使用.
Object.defineProperty(o, ‘name’, {
value: ‘value’,
configurable: false, // 不可删除
writable: true, // 可写
enumerable: true // 可枚举
});
需记住的四个重点 : 1,合并var obj2 = Object.assign({}, obj);
2, Object.keys(obj) 将可枚举的属性组成数组并返回
3,Object.values(obj) 将可枚举的属性的值组成数组并返回
4,hasOwnProperty判断属性是否为对象的对象属性而不是原型属性
闭包:用处:
a. 定义:当一个函数的返回值是另外一个函数,而返回的那个函数如果调用了其父函数内部的变量,且返回的这个函数在外部被执行就产生了闭包.闭包是一个环境,具体指的就是外部函数–高阶函数。说白了就是一个环境,能够读取其他函数内部的变量。本质上,闭包是将函数内部和函数外部连接起来的桥梁
● 用处:
a. 读取函数内部的变量
b. 这些变量的值始终保持在内存中,不会在外层函数调用后被自动清除
● 优点:
a. 变量长期驻扎在内存中
b. 避免全局变量的污染
c. 私有成员的存在
● 特性:
a. 函数套函数
b. 内部函数可以直接使用外部函数的局部变量或参数
c. 变量或参数不会被垃圾回收机制GC回收
this的四种指向
1,普通函数和回调函数的this指向window
2,构造函数中的this指向构造函数实例
3,对象中的this指向的是函数所在的对象本身,事件函数中this都指向事件所绑定的事件源
4,箭头函数会修改函数内部this的指向,内部的this指向函数外部this的指向
所谓构造函数,就是提供一个生成对象的模板,并描述对象的基本结构的函数:
类(构造函数)是对象(实例)的抽象化,对象(实例)是类(构造函数)的具象化、实例化
console.log(p.proto === Person.prototype); // true
function Person() {
this.say = function () {
console.log(‘实例方法’);
} //在外书写就是静态方法
}
Person.prototype.say = function () {
console.log(‘原型方法’);
}
Array.prototype.max = function () {
return Math.max(…this);
}
Array.prototype.min = function () {
return Math.min(…this);
}
第一关键字: constructor
构造器函数,构造方法,一个对象实例的构造器函数指向的是创建这个对象的构造函数
第二关键字: instanceof
判断实例对象是否来自于某个构造函数(包含原型链中的父函数)
链式调用
function Person() {
this.name = ‘张三’;
}
Person.prototype.say = function say() {
console.log(‘说’);
return this; // 函数执行完毕后,返回实例对象
}
Person.prototype.eat = function eat() {
console.log(‘吃’);
return this;
}
Person.prototype.run = function run() {
console.log(‘跑’);
return this;
}
var p = new Person();
console.log(p.say() === p); // true
p.say().eat().run(); // 说 吃 跑