首页 > 编程语言 >一文详解-JavaScript中 es5 原型和 es6-class

一文详解-JavaScript中 es5 原型和 es6-class

时间:2024-12-29 09:25:49浏览次数:3  
标签:function es6 es5 const name JavaScript new prototype 构造函数

一文详解-JavaScript中 es5 原型和 es6-class

Why You Must Stop Obsessing About These 5 Things in SEO

原型真的有用吗

有不少小伙子应该会有这个感觉 大家都在说原型 prototype 很重要,那为什么我却用不到?

原因不外乎这几个:

  1. 框架重度使用者,我们目前的前端主流业务, 几乎都是使用 vue,react,微信小程序在开发项目。这些框架封装得太过完美了,几乎不需要我们去做额外封装,哪怕有需求搞不定,变装一下,网络上寻求帮助,大把猥琐佬等着教你。
  2. 基础知识还不到家,都在使用框架做业务了,没有时间深入研究技术原理,也没有能力去封装造轮子
  3. 跳槽得太少了,没有怎么被面试官虐过,没有深刻体会过 面试造航母,工作拧螺丝 的快感。

于是乎,既然用不到,那就不用学,从自我做起,拒绝内卷。理解满分。。。。

然而残酷的真相是,只有技术是自己可以实实在在的去把控的,命运还是掌握在自己手中。

真相

刚刚想撸起袖子好好干, 一看这个神图。 “算了,上号吧”。

下面小弟尽量以最直白和简洁的图文给你梳理 ese5 和原型之间的关系。

img

什么时候需要用到原型

封装!!! 当我们想抽象某些公共业务 方便复用或者使结构更加清晰的时候便会用到。 面向对象三大特征:

  1. 封装
  2. 继承 (我把继承也归类到封装里面)
  3. 多态

比如 我们想创建一个

  • 圆角的 div 标签
  • 点击一下自己,会变大变小

将圆角 和 点击缩放 看成是公共业务即可。

我们会这么写

2021-06-15124749


如果 我们这个时候想要创建一个图片标签,也是圆角的,也是可以点击放大缩小呢

直接写

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么我们可以看到 我们是相等于把代码复制了一次的

const div = document.querySelector("div");
div.onclick = function () {
  this.classList.add("scale");
};

// 同样给图片绑定事件
const img = document.querySelector("img");
img.onclick = function () {
  this.classList.add("scale");
};

上述代码没有体现出封装。 而且比较零散,代码和业务掺杂在一起了。(对于一些简单的业务,这么写是没有问题的,怎么简单直接怎么来。)

采用 封装后的写法

// 实例化 div
new CreateCurveElement("div");

// 实例化 图片
new CreateCurveElement("img", { src: "images/1.png" });

// 构造函数
function CreateCurveElement(elementName, option) {
  const element = document.createElement(elementName);
  element.onclick = function () {
    element.classList.add("scale");
  };
  option &&
    Object.keys(option).forEach((key) =>
      element.setAttribute(key, option[key])
    );
  document.body.appendChild(element);
}

可以看到,以后想要创建带有 边框弯曲的元素,就直接 new 即可。 它有以下优势

  1. 复用了公共代码,如 createElementonclickclassList.add
  2. 隐藏了实现细节,让调用者只关注 业务本身,如 创建一个元素 new CreateCurveElement

有原型的什么事呢

上面的代码,也是存在弊端的,如 ,代码功能高度耦合,如果我们想要做任何功能的拓展的话,那么将会对代码结构产生破坏性的影响。因此,我们对于代码考虑的更多:

  • 能用
  • 性能好
  • 方便复用

基于以上需求,我们需要学习原型。

创建对象的方式

字面量

在 js 中,如果想要创建临时使用的对象,直接使用字面量方式即可。如

const person = {
  name: "路飞",
  skill: "变大变小",
};

工厂函数

但是如果 我们想要创建多个类似结构的对象时,字面量的方式就不方便维护了。如

const person1 = {
  name: "路飞",
  skill: "变大变小",
};
const person2 = {
  name: "金箍棒",
  skill: "变粗边长",
};
const person3 = {
  name: "熔岩巨兽",
  skill: "变壮变硬",
};

此时想要将 属性 name 修改为 username ,那么就需要挨个修改了。

因此我们可以使用工厂函数的方式:

const person1 = createPerson("路飞", "变大变小");

const person2 = createPerson("金箍棒", "变粗边长");

const person3 = createPerson("熔岩巨兽", "变壮变硬");

// 工厂函数
function createPerson(name, skill) {
  return {
    name,
    skill,
  };
}

此时,当我们想要修改 属性 name 时,直接修改 函数 createPerson 即可,干净利索。

构造函数

上述的工厂函数虽然解决了多个对象批量修改属性的问题,但是也是存在弊端的。请看以下的打印。

在 javascript 中,万物皆对象

function createPerson(name, skill) {
  return {
    name,
    skill,
  };
}

// 创建一个普通的对象
const person1 = createPerson("路飞", "变大变小");
console.log(person1);

// 打印 字面量
console.log({ name: "春卷", skill: "内卷" });

// 创建一个日期对象
const date = new Date();
console.log(date);

// 创建一个数组对象
const array = new Array();
console.log(array);

image-20210615222924670

可以看到,js 内置的对象 是有明显的标识的。如 Date 或者 Array,这些标识我们一看就明白。是日期数组

但是,我们自己创建的两个对象很明显,只有一个Object,而不具体其他的明显标识了。原因很简单

  1. Date,Array,FunctionRegexString,Number,Boolean 等都是 js亲 生的。
  2. 我们自己创建的对象 是野生的,所以不配有名字!

我不管,我也想要。

构造函数即可解决这个问题。

function SuperPerson(name, skill) {
  this.name = name;
  this.skill = skill;
}

// 创建一个普通的对象
const person1 = new SuperPerson("路飞", "变大变小");
console.log(person1);

image-20210615223740150

构造函数解析

  1. 构造函数也是一个函数
  2. 构造函数就是要被 new
  3. 构造函数内的 this 相等于 下面 person1
  4. 构造函数内不需要 return 默认就是 return this ;
  5. new 一次,就在内存中开辟一个新的空间。

构造函数的弊端

先看代码

function SuperPerson(name) {
  this.name = name;
  this.say = function () {
    console.log("拒绝内卷,从" + this.name + " 做起");
  };
}

const p1 = new SuperPerson("路飞");

const p2 = new SuperPerson("乔巴");

console.log(p1 === p2); // false

console.log(p1.name === p2.name); // false

console.log(p1.say === p2.say); // false

我们知道,数据类型比较的关键是

  1. 简单类型的比较 值比较 路飞乔巴

  2. 复杂类型的比较 引用地址比较

    1. p1p2
    2. p1.sayp2.say
  3. 如图所示

    image-20210615231029919

提取公共函数

不同对象之间 name 不一样 好理解,但是 他们的行为 也就是方法 -say,应该是一致的。也就是应该可以共用的,也就更能节省内存。 总之,我们想要实现

p1.say = p2.say;

这个好做,我们看看

function say() {
  console.log(this.name);
}

function SuperPerson(name) {
  this.name = name;
  // 指向外部的say
  this.say = say;
}

const p1 = new SuperPerson("路飞");

const p2 = new SuperPerson("乔巴");

console.log(p1.say === p2.say); // true

原理如图:

两个对象中的 say 方法 指向了同一个

image-20210615232137418

构造函数-原型

上述代码能够看出,虽然是解决了不同对象共享一个函数的弊端,但是代码的结构也未免太丑了,

  1. 一个功能 分成了两个入口 saySuperPerson
  2. say 方法也导致了全局污染
function say() {
  // 感情 say 这个名称就被你独占了
  console.log(this.name);
}

function SuperPerson(name) {
  this.name = name;
  // 指向外部的say
  this.say = say;
}

因此我们使用原型来解决 prototype

    function SuperPerson(name) {
      this.name = name;
    }

    // 在原型上定义方法
    SuperPerson.prototype.say = function () {
      console.log(this.name);
    }

    const p1 = new SuperPerson("路飞");

    const p2 = new SuperPerson("乔巴");

    console.log(p1.say === p2.say); // true

看到这里伙计们应该知道了这样写法没有问题了。但是底层的原因呢,我们现在就对原型做通俗讲解

原型的通俗讲解

JavaScript 中,任何对象都有一个原型,就像每一个人都有一个爸爸

标签:function,es6,es5,const,name,JavaScript,new,prototype,构造函数
From: https://blog.csdn.net/u013176440/article/details/144798751

相关文章

  • HTML&CSS&JavaScript&DOM 之间的关系?
    一、HTML中文名:超文本标记语言   英文名:HyperText Markup LanguageHTML是一种用来结构化Web网页及其内容的标记语言。HTML由一系列的元素组成,这些元素可以用来包围不同部分的内容,使其以某种方式呈现或者工作。图Ⅰ每个元素中都可以有自己的一些属性图Ⅱ......
  • Javascript数据结构常见题目(一)
    以下是每个问题的JavaScript实现:1.下一个更大元素(循环数组)functionnextGreaterElements(nums){letn=nums.length;letresult=Array(n).fill(-1);letstack=[];for(leti=0;i<2*n;i++){letnum=nums[i%n];......
  • Javascript数据结构常见面试题目(全)
    以下是一个前端JavaScript数据结构常见题目框架,可以帮助你快速组织思路并解决问题:框架内容1.数组相关查找与排序:寻找数组的最大/最小值。快速排序、归并排序、冒泡排序。操作:移除重复项:newSet()或双指针法。滑动窗口法:求最大/最小子数组和。二分查找:查找有序数......
  • [VUE]CALL_AND_RETRY_LAST分配失败-JavaScript堆内存不足 errno134
    使用vscode开发项目,由于项目较大,在运行npmrundev命令后,在一定的时间范围内,对vscode中的代码进行保存后,会自动编译运行,保存几次后就报错,需要重新运行npmrundev,很耗费时间)后报错报错:CALL_AND_RETRY_LASTAllocationfailed-JavaScriptheapoutofmemory(CALL_AND_RETRY_LAS......
  • JavaScript开发中常见问题代码和相关优化Demo参考4.0
    31. 忽略错误处理的幂等性问题代码:functionupdateUser(id,updates){//更新用户信息}解决方案:确保API端点和函数调用是幂等的,即多次调用不会导致不同的结果。asyncfunctionupdateUser(id,updates){try{awaitfetch(`/api/users/${id}`,{meth......
  • anime.js-强大的Javascript动画库插件
    anime.js是一款功能强大的Javascript动画库插件。anime.js可以和CSS3属性,SVG,DOM元素和JS对象一起工作,制作出各种高性能,平滑过渡的动画效果。在线预览  下载               使用方法在页面中引入anime.min.js文件。<scripttype="te......
  • 前端面试题合集(一)——HTML/CSS/Javascript/ES6
    前端经典面试题总结前端开发领域涵盖了大量的知识点,面试中的经典问题通常集中在HTML、CSS、JavaScript及ES6等基础技能上。以下是针对这些知识点的一些总结:1.HTMLHTML是Web页面结构的基础,它定义了网页的内容和结构。面试中的HTML问题常常涉及到常见标签的使用......
  • 你学习javascript的路线是怎样的?
    学习JavaScript(特别是针对前端开发)的路线可以因人而异,但以下是一个建议的学习路径,帮助你从基础到进阶,再到深入掌握JavaScript和前端开发技术:阶段一:基础学习JavaScript基础语法:变量、数据类型(Number,String,Boolean,Object,Null,Undefined等)运算符(算术、比较、逻辑、位......
  • 说说你对JavaScript与有限状态机的理解
    JavaScript:JavaScript是一种轻量级、解释型或即时编译型的编程语言,被广泛用于Web前端开发。它可以控制网页的行为,实现各种动态效果,与用户进行交互等。JavaScript的核心语法包括变量、数据类型、运算符、控制结构、函数等,同时它还支持面向对象编程。在前端开发中,JavaScript通常......
  • javascript如何实现有限状态机?
    有限状态机(FiniteStateMachine,FSM)是一种数学模型,用于描述系统在不同状态下的行为。在前端开发中,有限状态机可以用于管理复杂的UI交互逻辑,如游戏、表单验证等场景。下面是一个简单的JavaScript实现有限状态机的例子:classFiniteStateMachine{constructor(){this.ha......