Js: 构造函数、继承、面向对象

一、构造函数和原型

1、概述

在典型的OOP的语言中,都存在类的概念,类就是对象的模板,对象就是类的实例.但在ES6之前,Js中并没有引入类的概念;在es6之前,对象不是基于类创建的, 而是用一种称为构建函数的特殊函数来定义对象和他们的特征

2、构造函数

定义: 构造函数是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与new一起使用

实例化过程

  1. 在内存中创建一个新的空对象

  2. 让this指向这个新的对象

  3. 执行构造函数里面的代码,给这个2新对象添加属性和方法

  4. 返回这个新对象(构造函数里面不需要return)

注意:

  1. 构造函数用于创建某一类对象,其首字母要大写

  2. 构造函数要和new 一起使用才有意义

静态成员: 在构造函数本身上添加成员称为静态成员,只能由构造函数本身来访问

实例成员: 在构造函数内部创建的对象成员称为实例成员,只能由实例化的对象来访问

复制代码
function Star(uname, uage) {
  this.name = uname; // 实例成员
  this.age = uage; 
}


Star.sex = '男'; // 静态成员
let ldh = new Star('刘德华', 18); 

3、构造函数原型prototype

定义: 构造函数通过原型分配的函数是所有对象所共享的

特性:

  1. 每一个构造函数都有一个prototype属性,指向另一个对象. 注意这个prototype就是一个对象,这个对象的所有属性和方法,都会被构造函数所拥有

  2. 我们可以把那些不变的方法,直接定义在prototype对象上,这样所有对象的实例就可以共享这些方法

  3. 一般情况下,我们的公共属性定义到构造函数里面,公共的方法放到原型对象身上

4、对象原型__proto__

定义: 对象都会有一个属性__proto__指向构造函数的prototype原型对象,之所以我们对象可以使用构造函数prototype原型对象的属性和方法,就是因为对象有_proto_原型的存在

**方法查找规则:**首先看实例化对象身上是否有该方法,如果有就执行该实例化对象身上的方法;如果没有,因为__proto__的存在,就去构造函数原型对象prototype身上查找该方法

特性:

  1. __proto__对象原型和原型对象prototype是等价的

  2. proto 对象原型的意义就在于为对象的查找机制提供一个方向,或者说一条路线,但是它是一个非标准属性,因此在实际开发中,不可以使用这个属性,他只是内部指向原型对象prototype

5、constructor 构造函数

定义: 对象原型(proto)和构造函数(prototype)原型对象里面都有一个属性constructor属性,我们称为构造函数,因为它指回构造函数本身

如果我们修改了原来的原先对象,给原型对象赋值的是一个对象,则必须手动的利用constructor指回原来的构造函数

6、原型链

js的成员查找机制(就近原则):

  1. 当访问一个对象的属性/方法时,首先查找这个对象自身有没有该属性

  2. 如果没有就查找它的原型(也就是__proto__指向的prototype原型对象)

  3. 如果还没有就查找原型对象的原型(Object的原型对象)

  4. 依此类推一直找到Object为止(null)

  5. __proto__对象原型的意义就在于为对象成员查找机制提供一个方向,或者说一条路线

7、扩展内置对象

定义: 可以通过原型对象,对原来的内置对象进行扩展自定义的方法.比如给数组增加自定义求偶数和的功能

注意: 数组和字符串内置对象不能给原型对象覆盖操作 Array.prototype = {}, 只能是Array.prototype.xxx = function() {} 的方式

二、继承

定义: ES6之前并没有给我们提供extends继承,我们可以通过构造函数+原型对象模拟实现继承,被称为组合继承

1、call()方法

定义: 调用这个函数,并且修改函数运行时的this指向

复制代码
fun.call(thisArg, arg1, arg2, ...)

thisArg: 当前调用函数this的指向对象

arg1, arg2: 传递的其它参数

2、借用构造函数继承父类型属性

核心原理: 通过call()把父类型的this指向子类型的this, 这样就可以实现子类型继承父类型的属性

复制代码
// 借用父构造函数继承属性
  // 父构造函数
  function Father(uname, age) {
      this.uname = uname;
      this.age = age;
  }


  // 子构造函数
  function Son(uname, age) {
      Father.call(this, uname, age);
  }


  let son = new Son('Amumu', 18);
  console.log(son); // Son {uname: 'Amumu', age: 18}

3、借用原型对象继承父类型方法

复制代码
 // 父构造函数
    function Father(uname, age) {
        this.uname = uname;
        this.age = age;
    }


    Father.prototype.money = function () {
        console.log('Father money called');
    }


    // 子构造函数
    function Son(uname, age, score) {
        Father.call(this, uname, age);
        this.score = score;
    }
    // 利用对象的形式修改了原形对象
    Son.prototype = new Father();
    // 利用constructor指回原来的构造函数
    Son.prototype.constructor = Son;
    Son.prototype.exam = function() {
        console.log('Son exam called');
    }
    // 实例化Son对象
    let son = new Son('Amumu', 18, 0);
    console.log(son); // Son {uname: 'Amumu', age: 18, score: 0}
    console.log(Father.prototype, Son.prototype);

三、面向对象

1、面向过程编程(POP)

定义: 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了(就是按照我们分析好了的步骤,按照步骤解决问题)

优点: 性能比面向对象高,适合跟硬件联系跟紧密的东西,例如单片机等等

缺点: 没有面向对象易维护、易复用、易扩展

2、面向对象编程(OOP)

定义: 面向对象就是把事物分解成一个个对象,然后由对象之间分工与合作

优势:

  1. 在面向对象程序开发思想中,每一个对象都是功能中心,具有明确分工.

  2. 面向对象编程具有灵活、代码可复用、容易维护和开发的优点,更适合多人合作的大型软件项目

缺点: 性能比面向过程低

特性: 封装性、继承性、多态性

思维特点:

  1. 抽取(抽象)对象共用的属性和行为组织(封装)成一个类(模板)

  2. 对类进行实例化,获取类的对象

总结: 面向对象编程我们考虑的是有哪些对象,按照面向对象的思维特点,不断的创建对象,使用对象,指挥对象做事情

3、对象和类

对象定义: 在Js中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象.例如: 字符串、数值、数组、函数等

对象是由属性和方法组成的:

  1. 属性:事物的特征, 在对象中用属性来表示

  2. 方法: 事物的行为,在对象中用方法来表示

类定义: 在es6中新增了类的概念,可以使用class关键字声明一个类,之后以这个类来实例化对象

类抽象类对象的公共部分,它泛指某一大类; 对象特指某一个,通过类实例化一个具体的对象

相关推荐
想吃火锅10052 天前
【前端手撕】instanceof
前端·javascript·原型模式
UXbot3 天前
帮助企业低门槛开展AI应用开发的平台推荐
前端·低代码·ui·交互·产品经理·原型模式·web app
UXbot3 天前
如何选择适合公司项目的UI设计工具?企业选型指南
前端·低代码·ui·团队开发·原型模式·设计规范·web app
UXbot3 天前
原型设计工具如何帮助新人快速进入产品行业?
前端·低代码·ui·交互·团队开发·原型模式·web app
sunny.day8 天前
js原型与原型链
开发语言·javascript·原型模式·js原型链
UXbot8 天前
AI网页开发工具能替代工具吗?5大平台对比
前端·人工智能·低代码·ui·原型模式·web app
weixin_307779139 天前
从“大海捞针”到“主动推理”:AI如何重塑云原生故障诊断的根因链
开发语言·人工智能·算法·自动化·原型模式
swordbob9 天前
prototype 注入到 singleton 里,prototype是否还是线程安全的
安全·spring·单例模式·原型模式
isNotNullX9 天前
企业数据中台建设,ETL工具选错了会踩哪些坑?
数据仓库·etl·原型模式
半个烧饼不加肉10 天前
JS 底层探究-- 普通函数和构造函数
开发语言·javascript·原型模式