前端路由&vue-router部分解读

vue2升级vue3踩坑记录(二)mixins 和 vue-router Ant Design of Vue的V2版本表单校验和vue-router 4.1.6版本的填坑记录 阅读详情

前端路由

由于SPA单页应用以及前后端分离的思想的出现,前端路由在当今的前端开发中是必不可少的。一些流行框架vue、react都有对应的实现vue-router、react-router等。

框架路由的实现都是对原生路由进行了封装。原生路由我们通常采用hash实现或者H5的history实现。

hash路由

hash路由:一个明显的标志就是带有#,我们主要是通过监听url中的hash变化来进行路由跳转。
hash的优势就是具备好的兼容性,唯一的不好就是url中会一直存在#不够美观,看起来更像是hack实现。

下面基于hash实现一个简单的路由。(采用ES6的语法)

class Routers {
    constructor() {
        // 以键值对形式储存路由
        this.routes = {};
        // 当前路由的URL
        this.currentUrl = '';
        // 记录出现过的hash
        this.history = [];
        // 作为指针,默认指向this.history的末尾,根据后退前进指向history中不同的hash
        this.currentIndex = this.history.length - 1;
        this.refresh = this.refresh.bind(this);
        this.backOff = this.backOff.bind(this); 

        // 默认不是后退操作
        this.isBack = false;
        window.addEventListener('load', this.refresh, false);
        window.addEventListener('hashchange', this.refresh, false);
    }
    // 将path路径与对应的callback函数存储
    route(path, callback) {
        this.routes[path] = callback || function() {};
    }
    // 刷新
    refresh() {
        // 获取当前URL中的hash路径
        this.currentUrl = location.hash.slice(1) || '/';
        if(!this.isBack) {
            if (this.currentIndex < this.history.length - 1) {
                this.history = this.history.slice(0, this.currentIndex + 1);
            }
            this.history.push(this.currentUrl);
            this.currentIndex++;
        }
        // 执行当前hash路径的callback函数
        this.routes[this.currentUrl]();
        this.isBack = false;
    }
    // 后退
    backOff() {
        // 后退操作设置为true
        this.isBack = true;
        // 如果指针小于0的话就不存在对应的hash路由
        this.currentIndex <= 0 ? (this.currentIndex = 0) : (this.currentIndex = this.currentIndex - 1);
        // 随着后退,location.hash页应该随之变化
        location.hash = `#${this.history[this.currentIndex]}`;
        // 执行指针目前指向hash路由对应的callback
        this.routes[this.history[this.currentIndex]]();
    }
}
    // 调用
    Router.route('/',function() {

    });

HTML5 history API路由

部分API介绍

window.history.back(); // 后退
window.history.forward(); // 前进
window.history.go(-3); // 后退3个页面


// history.pushState用于在浏览历史中添加历史记录,但是不触发跳转

// 三个参数

/*
state: 一个与指定网址相关的状态对象,popstate事件触发时,该对象会传入回调函数。如果不需要这个对象,此处可以填null。

title: 新页面的标题,但是所有浏览器目前都忽略这个值,因此可以填null。

url:新的网址,必须与当前页面处在同一个域。浏览器的地址栏将显示这个网址。
*/


// history.replaceState方法的参数与pushState方法一模一样,区别是它修改浏览历史中当前记录,而非添加记录,同样不触发跳转。

/*
popstate事件,每当同一个文档的浏览历史(即history对象)出现变化时,就会触发popstate事件。仅仅调用pushState和replaceState方法,并不会触发该事件,只有用户点击浏览器倒退按钮和前进按钮,或者使用JavaScript调用back、forward、go方法时才会触发。另外该事件只针对同一个文档,如果浏览历史切换导致加载不同的文档,该事件也不会触发。
*/

下面基于新的标准实现一个简单路由

    class Routers {
        constructor() {
            this.routes = {};
            // 在初始化时监听popstate事件
            this._bindPopState();
        }

        // 初始化路由
        init(path) {
            history.replaceState({path: path}, null, path);
            this.routes[path] && this.routes[path]();
        }
        // 将路径和对应的回调函数加入hashMap存储
        route(path, callback) {
            this.routes[path] = callback || function() {};
        }
        // 触发路由对应回调
        go(path) {
            history.pushState({path:path}, null, path);
            this.routes[path] && this.routes[path]();
        }
        // 监听popstate事件
        _bindPopState() {
            window.addEventListener('popstate', e => {
                const path = e.state && e.state.path;
                this.routes[path] && this.routes[path]();
            });
        }
    }

vue-router部分实现


    // 创建路由
    const routes = [
        {// 首页
            path: '/',
            component: () => import('src/pages/home/index.vue')
        },
        {// 首页更多功能
            path: '/functionManage',
            component: () => import('src/pages/home/functionManage.vue')
        }
    ]
    // router路由管理
    const router = new VueRouter({
        routes,
    })

    // router实例注入根实例
    window.vm = new Vue({
        router
    })

通过mode参数控制路由的实现模式。

    const router = new VueRouter({
    // HTML5 history 模式
    mode: 'history',
    base: process.env.NODE_ENV === 'production' ? process.env.PROXY_PATH : '',
    routes,
})

在入口文件中需要实例化一个 VueRouter 的实例对象 ,然后将其传入 Vue 实例的 options 中。

    var VueRouter = function VueRouter(options) {
        // match匹配函数
        this.matcher = createMatcher(options.routes || [], this);
        // 根据mode实例化具体的History,默认为'hash'模式
        var mode = options.mode || 'hash';
        // 通过supportsPushState判断浏览器是否支持'history'模式
        // 如果设置的是'history'但是如果浏览器不支持的话,'history'模式会退回到'hash'模式
        // fallback 是当浏览器不支持 history.pushState 控制路由是否应该回退到 hash 模式。默认值为 true。
        this.fallback = mode === 'history' && !supportsPushState &&   options.fallback !== false;
        if (this.fallback) {
            mode = 'hash';
        }
        this.mode = mode;
        // 根据不同模式选择实例化对应的History类
        switch (mode) {
            case 'history':
                this.history = new HTML5History(this, options.base);
                break;
            case 'hash': 
                this.history = new HashHistory(this, options.base, this.fallback);
                break;
        }
    }


    //作为参数传入的字符串属性mode只是一个标记,用来指示实际起作用的对象属性history的实现类,两者对应关系:
    modehistory: 
        'history': HTML5History;
        'hash': HashHistory;
        'abstract': AbstractHistory;

在初始化对应的history之前,会对mode做一些校验:若浏览器不支持HTML5History方式(通过supportsPushState变量判断),则mode设为hash;若不是在浏览器环境下运行,则mode设为abstract;
VueRouter类中的onReady(),push()等方法只是一个代理,实际是调用的具体history对象的对应方法,在init()方法中初始化时,也是根据history对象具体的类别执行不同操作

HashHistory

1、hash虽然出现在url中,但不会被包括在http请求中,它是用来指导浏览器动作的,对服务器没有影响,改变hash不会重新加载页面。
2、监听hash
window.addEventListener(‘hashchagne’, function, false)
3、每一次改变hash(window.location.hash),都会在浏览器访问历史中增加一个记录。
Vue作为渐进式的前端框架,本身的组件定义中应该是没有有关路由内置属性_route,如果组件中要有这个属性,应该是在插件加载的地方,即VueRouter的install()方法中混入Vue对象的,install.js的源码:

function install (Vue) {

  ...

  Vue.mixin({
    beforeCreate: function beforeCreate () {
      if (isDef(this.$options.router)) {
        this._routerRoot = this;
        this._router = this.$options.router;
        this._router.init(this);
        Vue.util.defineReactive(this, '_route', this._router.history.current);
      } else {
        this._routerRoot = (this.$parent && this.$parent._routerRoot) || this;
      }
      registerInstance(this, this);
    },
    destroyed: function destroyed () {
      registerInstance(this);
    }
  });
}

通过Vue.mixin()方法,全局注册一个混合,影响注册之后所有创建的每个Vue实例,该混合在beforeCreate钩子中通过Vue.util.defineReactive()定义了响应式的_route属性。所谓响应式属性,即当_route值改变时,会自动调用Vue实例的render()方法,更新视图。

$router.push()–>HashHistory.push()–>History.transitionTo()–>History.updateRoute()–>{app._route=route}–>vm.render()

HashHistory.push()方法:将路由添加到浏览器访问历史栈顶(直接对window.location.hash赋值)
HashHistory.replace()方法:替换掉当前路由(调用window.location.replace)

监听地址栏:
上面的VueRouter.push()和VueRouter.replace()是可以在vue组件的逻辑代码中直接调用的,除此之外在浏览器中,用户还可以直接在浏览器地址栏中输入改变路由,因此还需要监听浏览器地址栏中路由的变化 ,并具有与通过代码调用相同的响应行为,在HashHistory中这一功能通过setupListeners监听hashchange实现:相当于直接调用了replace方法。

HTML5History

History interface是浏览器历史记录栈提供的接口,通过back(),forward(),go()等方法,我们可以读取浏览器历史记录栈的信息,进行各种跳转操作。
HTML5引入了history.pushState()和history.replaceState()方法,他们分别可以添加和修改历史记录条目。这些方法通常与window.onpopstate配合使用。
window.history.pushState(stateObject,title,url)
window.history,replaceState(stateObject,title,url)
复制代码
stateObject:当浏览器跳转到新的状态时,将触发popState事件,该事件将携带这个stateObject参数的副本
title:所添加记录的标题
url:所添加记录的url(可选的)

pushState和replaceState两种方法的共同特点:当调用他们修改浏览器历史栈后,虽然当前url改变了,但浏览器不会立即发送请求该url,这就为单页应用前端路由,更新视图但不重新请求页面提供了基础。

export function pushState (url?: string, replace?: boolean) {
    saveScrollPosition()
    // 加了 try...catch 是因为 Safari 有调用 pushState 100 次限制
    // 一旦达到就会抛出 DOM Exception 18 错误
    const history = window.history
    try {
        if (replace) {
            // replace 的话 key 还是当前的 key 没必要生成新的
            history.replaceState({ key: _key }, '', url)
        } else {
            // 重新生成 key
            _key = genKey()
            // 带入新的 key 值
            history.pushState({ key: _key }, '', url)
        }
    } catch (e) {
        // 达到限制了 则重新指定新的地址
        window.location[replace ? 'replace' : 'assign'](url)
    }
}

// 直接调用 pushState 传入 replace 为 true
export function replaceState (url?: string) {
    pushState(url, true)
}

复制代码代码结构以及更新视图的逻辑与hash模式基本类似,只不过将对window.location.hash()直接进行赋值window.location.replace()改为了调用history.pushState()和history.replaceState()方法。
在HTML5History中添加对修改浏览器地址栏URL的监听popstate是直接在构造函数中执行的:

constructor (router: Router, base: ?string) {

  window.addEventListener('popstate', e => {
    const current = this.current
    this.transitionTo(getLocation(this.base), route => {
      if (expectScroll) {
        handleScroll(router, route, current, true)
      }
    })
  })
}

复制代码以上就是’hash’和’history’两种模式,都是通过浏览器接口实现的。

两种模式比较

一般的需求场景中,hash模式与history模式是差不多的,根据MDN的介绍,调用history.pushState()相比于直接修改hash主要有以下优势:

1、pushState设置的新url可以是与当前url同源的任意url,而hash只可修改#后面的部分,故只可设置与当前同文档的url
2、pushState设置的新url可以与当前url一模一样,这样也会把记录添加到栈中,而hash设置的新值必须与原来不一样才会触发记录添加到栈中
3、pushState通过stateObject可以添加任意类型的数据记录中,而hash只可添加短字符串
4、pushState可额外设置title属性供后续使用

history模式的问题

hash模式仅改变hash部分的内容,而hash部分是不会包含在http请求中的(hash带#):
http://oursite.com/#/user/id //如请求,只会发送http://oursite.com/
所以hash模式下遇到根据url请求页面不会有问题
而history模式则将url修改的就和正常请求后端的url一样(history不带#)
http://oursite.com/user/id
如果这种向后端发送请求的话,后端没有配置对应/user/id的get路由处理,会返回404错误。
官方推荐的解决办法是在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。同时这么做以后,服务器就不再返回 404 错误页面,因为对于所有路径都会返回 index.html 文件。为了避免这种情况,在 Vue 应用里面覆盖所有的路由情况,然后在给出一个 404 页面。或者,如果是用 Node.js 作后台,可以使用服务端的路由来匹配 URL,当没有匹配到路由的时候返回 404,从而实现 fallback。

参考链接:https://juejin.im/post/5b08c9ccf265da0dd527d98d

V3-09 vue 组件化思想+ 路由(vue语法---终篇) 1.Vue 组件化思想 1.1 分布式 -->传统项目的设计思想 说明: 单体项目架构设计在同一个Tomcat服务器中,如有个模块出现问题, 影响整个服务器无法运行 1.2 分布式思想 核心理念: 根据特定的规则,将程序进行拆分, (微服务架构思想) ---->根据模块拆分 说明: 根据不同模块拆分不同服务器,一个出现问题, 不影响其他 ---->按照层级拆分 ----->分布式总结 分布式架构设计主要解决系统架构设计的耦合性(架构师+压测+后台监控) . 阅读详情

相关推荐

[LaTeX] 调整参考文献的格式(References),包括作者名缩写,行距,字体,引用顺序等等

在此记录我对LaTeX中参考文献references的尝试,主要涵盖如题几个方面。

the Blog of 等不到天亮丶等时光 4万+

vue-router路由、mixin混入、vue-resource、axios、计算属性watch、moment.js、vuex、vue-cli、数据双向绑定、搭建vue环境、vue实例、配置启动项

路由vue-router介绍: // 1.前端路由核心:锚点值的改变,根据不同的锚点值,渲染指定dom位置的不同数据。 // 2.vue中,模板数据不是通过ajax请求的,而是调用函数获取到模板内容 // 3.vue-router使用方式: // 1.下载路由组件 : npm i vue-router -S // 2.在路由router.js文件中引入vue-router组件 : import Router from

专研前端,探索后端 586

Cesium中实现GPU计算的泥石流地形侵蚀

通过模拟分析,可以提前识别可能发生泥石流的区域,为防灾减灾提供依据,及时发布预警,避免或减少人员伤亡和财产损失。:在建设公路、桥梁、水库等基础设施时,通过泥石流模拟分析,可以预测泥石流可能对这些设施的影响,帮助工程设计者采取合适的防护措施,确保设施的安全性。:模拟分析有助于为灾后救援工作提供科学依据,确定受灾区域的范围、救援难度等,为救援队伍制定合理的行动方案,提升救援效率。:泥石流是山区常见的地质灾害之一,通过模拟分析可以评估某一地区发生泥石流的风险,指导土地使用规划、人口迁移等决策。

weixin_43481439的博客 1320

vue-router原理解析

一 主要有两种模式hash模式和history模式。 1.hash模式 URL的hash 是以#开头,是基于location.hash来实现的。 Location.hash的值就是URL中#后面的内容。当hash改变时,页面不会因此刷新,浏览器也不会请求服务器。 同时,hash 改变时,并会出发相应的hashchange时间,所以,hash很适合被用来做前端路由。当hash路由发生跳转,便会触发hashchange回掉,回掉里面就可以实现页面的更新操作,从而达到跳转页面的效果。 // 当Html文档加

cxz 596

[原创]Linux 802.11n CSI tool Monitor模式

Linux 802.11n CSI tool Monitor模式 使用AP模式的缺陷在于ping 命令速度比较慢,且不能精确控制发送的参数,比如接收的包数量是不可控的。Monitor模式可以调制发送速率、发包数量、发送天线个数、HT模式、short/long guard interval等等,因此调通Monitor模式是必须的。期间参考了博主沃一德的CSI Tool安装使用讲解,对他的工作表示感...

u014645508的博客 1万+

[模型部署]-[LLM]昇腾部署Qwen3-Coder-30B-A3B-Instruct

摘要:本文介绍了在Ascend NPU上部署Qwen3-Coder-30B-A3B-Instruct大模型的实践过程。通过vLLM-Ascend框架,详细说明了环境准备(CANN 8.1、PyTorch-NPU 2.5.1等)、模型下载、容器启动及服务部署步骤,包括vLLM服务的启动参数配置和接口测试方法。测试结果显示在当前2卡910B3配置下性能表现仅为8token/s(1并发),并指出流式调用时存在无法输出usage信息的问题。该方案为Ascend平台私有化部署大模型推理服务提供了参考实现。

1671

Vue之mixin全局的用法详解

个人觉得全局mixin就是给全部Vue文件添加一些公用的实例(方法,过滤器and so on) 使用场景:货币单位,时间格式。这些如果在用到的页面使用的话代码会重复的很多,所以在全局混入这些实例会减少代码量,可维护性也比较高。 ex: step1: 先定义mixin.js 1 2 3 4 5 6 7 8 9 1...

蜗牛不会跑 7005

RAG开源框架深度评测:从RAGFlow到Dify的实战选型指南

本文深度评测了主流RAG开源框架(RAGFlow、Dify、WeKnora)的核心能力与实战表现,提供企业级选型指南。重点对比了文档解析、检索性能和生产部署等关键指标,揭示RAGFlow在复杂文档处理、Dify在低代码开发、WeKnora在腾讯生态集成的差异化优势,并给出技术选型决策树与成本优化方案。

weixin_29294597的博客 827

vue通过 vue.mixin(混合)实现 任意页面记录滚动条位置(路由router.query参数一致) 并跳转到上次的位置

main.js 中编写全局混合事件,会在子组件前出发对应事件,此功能需要以下几个条件: 1.滚动页面必须为 keep-alive:true, 通过meta.keppAlive去动态加载需要缓存的组件,以后只需要在路由index.js里把false改成true /* *  核心代码 */ Vue.mixin({ data(){ return { prev_S

qq_35319282的博客 2323

【数据结构】期末考试复习(考点+例题)

1.线性表定义及其存储实现:顺序表和链接表,优缺点分析(顺序存储可随 机访问,链式存储可灵活利用空间),相关操作的时间复杂度。 2.链表的插入删除操作 3.两种特殊的线性表及其应用:栈、队列 4.栈、队列上的(插入/删除)操作及其特点 5.循环队列满和空的条件 6.能够定义线性表、栈、队列的数据存储结构,能够实现相关操作的算法并 分析时间复杂度(例如插入、删除及其它应用等) 7.理解线性结构的应用( 如根据要求能灵活定义线性表结构,能根据线性表 的插入、删除操作解决实际问题) 二叉树基本概念与性质(高

Molly 的博客 9369

基于YOLOv8的违规抽烟/打电话检测系统:从数据集构建到部署实战

模型优点缺点精度高速度慢(5 FPS)SSD速度快小目标检测差YOLOv5平衡性好官方支持停止YOLOv8最新、最快、最准需要PyTorch环境YOLOv8相比前代:骨干网络升级(C2f模块)无锚框检测(Anchor-Free)动态任务对齐分配(TaskAlignedAssigner)支持分类/检测/分割/姿态估计。

YOLO 98

Vue 中mixin 的用法详解

说下我对vue中mixin的一点理解  vue中提供了一种混合机制--mixins,用来更高效的实现组件内容的复用。最开始我一度认为这个和组件好像没啥区别。。后来发现错了。下面我们来看看mixins和普通情况下引入组件有什么区别?     组件在引用之后相当于在父组件内开辟了一块单独的空间,来根据父组件props过来的值进行相应的操作,单本质上两者还是泾渭分明,相对独立。     而mixins则...

GoodIdea 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Vue之mixin(全局)

全局mixin就是给全部Vue文件添加一些公用的实例(方法,过滤器and so on) 使用场景:请求方式,时间格式。这些如果在用到的页面使用的话代码会重复的很多,所以在全局混入这些实例会减少代码量,可维护性也比较高。 ex: 在main.js直接写入 Vue.mixin({ data () { return { router: '/', plusRe...

岁月如歌去,十年弹指间 5814

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Vue源码解析(六)-vue-router

先上一段简单的demo,本文根据此demo进行解析 Vue.use(VueRouter) const router = new VueRouter({ routes: [ { path: '/home', component: {template: '<div>home</div>'}} ...

weixin_33849942的博客 173

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

VueRouter源码浅析

路由原理 前端路由原理主要是监听浏览器的url变化来达到根据不同url渲染不同页面的目的。 VueRouter主要有三种实现方式: history模式 hash模式 abstract模式 本文主要讨论hash模式。 使用 先看VueRouter的构造函数 var VueRouter = function VueRouter (options) { if ( options...

qq_33203555的博客 906

Vue学习:Vue中的路由详解(完整版)

vue中的路由知识详解完整版

qq_49916504的博客 1万+

vue 在微信端实现前进左滑,返回右滑的动画效果

记录项目中遇到的问题: 1.前进页面左滑,返回页面右滑 的动画效果 2.前进页面数据刷新,返回页面不刷新 目的:通过缓存数据,减少调用接口的次数 App.vue &lt;template&gt; &lt;div id="app"&gt; &lt;transition :name="transitionName"&gt; &lt;keep-alive&gt; ...

未兆的博客 5520

Python3调用腾讯长语音接口(重点在回调url(callback url))

另一部分调用的代码主要用用的这篇文章现成的:https://blog.youkuaiyun.com/huangmingleiluo/article/details/82784877 当时看了上面的参照,上传文件没问题了,回调url不知道咋搞,用tornado写了个服务部署在阿里云上,还真成功了。 但是发现腾讯有的任务不调用我的回调url,测试10个音频可能有一两个没结果,不知道为啥 callba...

wangjinyu124419的博客 2250

vue路由使用思想

当页面处于同一个视口并且需要有切换进行分页路由展示时使用嵌套路由, 若视口都处于一个同等级大小的状态,则不能使用嵌套路由。

qq_41619567的博客 205

钉钉文档接入(回调url接口)

准备工作: 使用的jar包,和dome下载地址: https://github.com/opendingtalk/eapp-isv-quick-start-java.git 1.接入说明 由于业务发展,需要接入钉钉平台,特整理了一份简明的接入文档,此文档旨在帮助用户快速熟悉钉钉平台,调用钉钉相关接口,以实现具体的业务逻辑。 详细的官方文档地址:https://open-doc.dingta...

weixin_40222278的博客 1万+

关于AJAX请求JSON数据(解决responseText空的问题)

AJAX请求服务器提供的JSON数据 大家在前后端交互时,前台网页会和后台服务器以及数据库进行交互。感觉比较基础的就是将从后台获取的数据显示到页面中。最近,刚开始使用AJAX处理数据交互,遇到一些问题,并且解决了,做以下分享。 众所周知,AJAX的核心是XMLHttpRequest对象。它完成了对数据的请求以及获取。见下:var xhr = new XMLHttpRequest(); var u

HCJS_Zee的博客 1万+

箭头函数

箭头函数表达式的语法比函数表达式更短,并且没有自己的this,arguments,super或new.target。这些函数表达式更适用于那些本来就需要匿名函数的地方,并且它们不能用作构造函数。 基础语法 (参数1,参数2,...,参数N) =&amp;amp;amp;amp;amp;gt; { 函数表达式 } (参数1,参数2,...,参数N) =&amp;amp;amp;amp;amp;gt;表达式(单一) //相当于:(参数1,参数2,...,参数N) =&am

HCJS_Zee的博客 1667

ES6&ES5实现观察者模式(发布订阅者模式)

ES6 class Observer{ constructor(){ this.handle = []; } addSubscribe(topic, fn) { this.handle.push({topic: topic, fn: fn}); console.log(this.handle); } removeSubscribe(topic, fn) { let ind...

HCJS_Zee的博客 1266

ECMAScript异步编程

ECMAScript异步编程 涉及知识点: ECMAScript2015+ Promise async/await 异步编程 node.js服务器 const express = require('express') const app = express() app.get('/', (req, res) =&amp;amp;amp;gt; { res.setHeader('...

HCJS_Zee的博客 555

JavaScript中的原型(链)&继承(一)

Zee有话说^_^,下面的内容大部分摘自《Professional JavaScript for Web Developers (3rd edition )》和《JavaScript语言精粹与编程实践》。结合书中一些概念,总结了对书中知识的理解。为了方便自己回顾以及帮助更多朋友。可能有不准确的地方,希望交流探讨。 博文相关内容解析:构造器(constructor)–> 构造函数——(构造器实际

HCJS_Zee的博客 495
上一篇: ECMAScript异步编程
下一篇: JavaScript设计模式之单例模式
DoubleSRZee
博客等级 码龄10年 7粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值