/*
        面向对象编程
            
            本质 创建一个对象
                 可以用 属性属性值的 方式 存储 数据参数
                        函数的参数 只能存储在形参之中 只能在函数内部使用 不能在函数外部直接调用
                 可以用 函数的形式 存储需要执行的程序内容
                 调用生成的对象,属性属性值就是需要的数据参数,函数方法就是需要执行的程序
    
            定义 属性属性值存储参数数据
                通过构造函数定义实例化对象
                    通过 new 关键词/语法 执行调用 构造函数
                    new 语法 会自动定义 一个对象,并且返回一个对象
                    this 指向 这个 被JavaScript自动创建 自动返回的 对象
                    返回的对象,最终会存储在变量中
                    this 实际指向的就是 这个变量
                    在构造函数中,不能使用 let const 定义变量
            定义 函数方法
                通过 prototype 来定义 构造函数的方法
                    prototype 是每一个 函数都天生具有的 属性 是一个 公共的空间
                    所有通过这个构造函数生成的实例化对象,都可以代用这个公共空间中的内容
                    在 prototype 中 只能调用 之前 在构造函数中定义的实例化对象的属性和属性值
                    在 prototype 中 不能以 this 语法定义属性和属性值
                    在 prototype 中 可以用 let  或者 const 定义 变量数值
                    本质上就是在定义一个匿名函数 只是存储在 prototype 中的一个匿名函数
            原型链:
                prototype : 函数天生就具有的属性
                            是一个公共空间 构造函数生成的实例化对象的__proto__ 就是 构造函数的prototype 
                __proto__ : 对象天生就具有的属性
                            通过 __proto__ 可以访问 生成这个对象,构造函数的 prototype 的公共空间
                所谓的原型链 : 将 数据 通过 __proto__ 串联起来,形成数据链结构 称为原型链
                              定义在顶级/父级对象,公共空间的中的属性和方法,可以被所有的子级通过 __proto__ 调用和执行
                              原型链的执行是一个自动过程 当 一个对象等调用属性/方法时,先在自身上,自身没有去父级公共空间找,父级没有再去父级的父级找
                              以此类推,最终找到 顶级对象 Object 如果也没有,返回undefined
                   顶级对象 Object (定义了一个方法) ---> Array() 构造函数 ---> 生成一个 arr[] 数组
                                                                            
                                                                     
                    顶级对象 Object (定义的方法) <----  Array() 构造函数 通过 __proto__ <--- arr[] 数组 通过 __proto__
        
                爷爷 (方法) ---- 爹  --- 孙子 
                爷爷身上有个函数方法,没有定义在爹身上,也没有定义在孙子身上
                但是 孙子 可以通过 __proto__ 找到 爹
                爹 本身也有 __proto__ 可以 找到 爷爷 然后 调用 爷爷身上的 方法
 
   <script>  
        const obj = new CreateObj('张三');
        obj.fun();
        // 使用 function 定义构造函数
        // JavaScript会执行预解释,可以提前调用构造函数,生成实例化对象
        function CreateObj(name) {
            this.name = name;
        }
        // 定义 prototype 公共空间中的 内容
        // 不会被 预解释 
        // 调用 fun 这个函数 必须在 这个行代码之后,不能提前调用
        CreateObj.prototype.fun = function(){
            console.log( this.name );
        } 
        console.log(obj);
        // ES5 语法定义的构造函数,在面向对象编程中,还有很多问题
        // ES6 语法中,定义了新的构造函数的定义方法 class 类
        //            专门用于定义 构造函数的语法
        //            新增很多构造函数的操作方法,让js的面向对象编程更加完善
        //            在 三阶段 框架中 对 js 的面向对象 才是完整的 面向对象
        // class语法的本质就是 构造函数 
        // 语法结构和内容是完全相同的 只是 代码书写不同
        // 就好像  for循环 和 while循环
        // ES6 的 class 没有预解析,不能提前调用
        // ES5
        function CreateObj1(name) {
            this.name = name;
        }
 
        CreateObj.prototype.fun1 = function(){
            console.log( this.name );
        } 
        const obj1 = new CreateObj1('张三');
        obj1.fun1();
        // ES6
        class CreateObj2{
            constructor(name){
                this.name = name;
            }
            fun2(){
                console.log( this.name )
            }
        }
        const obj2 = new CreateObj1('张三');
        obj2.fun2();
 
    </script>

面向对象编程 es5和es6的构造函数的更多相关文章

  1. Javascript面向对象编程(二):构造函数的继承 作者:yuan一峰

    Javascript面向对象编程(二):构造函数的继承   作者: 阮一峰 日期: 2010年5月23日 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生 ...

  2. javascript 面向对象编程(工厂模式、构造函数模式、原型模式)

      javascript 面向对象编程(工厂模式.构造函数模式.原型模式) CreateTime--2018年3月29日17:09:38 Author:Marydon 一.工厂模式 /** * 工厂模 ...

  3. js面向对象编程(三)非构造函数的继承(转载)

    Javascript面向对象编程(三):非构造函数的继承 今天是最后一个部分,介绍不使用构造函数实现"继承". 一.什么是"非构造函数"的继承? 比如,现在有一 ...

  4. Javascript面向对象编程(二):构造函数的继承 by 阮一峰

    今天要介绍的是,对象之间的"继承"的五种方法. 比如,现在有一个"动物"对象的构造函数. function Animal(){ this.species = & ...

  5. (转)Javascript面向对象编程(二):构造函数的继承(作者:阮一峰)

    对象之间的"继承"的五种方法. 比如,现在有一个"动物"对象的构造函数. function Animal(){ this.species = "动物& ...

  6. Javascript面向对象编程(二):构造函数的继承

    这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承"的五种方法. 比如,现在有一个" ...

  7. JS面向对象编程(二):构造函数的继承

    对象之间继承的 5 中方法.            比如, 现在有一个"动物"对象的构造函数.            function Animal(){              ...

  8. 面向对象编程-终结篇 es6新增语法

    各位,各位,终于把js完成了一个段落了,这次的章节一过我还没确定下面要学的内容可能是vue也可能是前后端交互,但无论是哪个都挺兴奋的,因为面临着终于可以做点看得过去的大点的案例项目了,先憋住激动地情绪 ...

  9. js面向对象编程(二)构造函数的继承(转载)

    Javascript面向对象编程(二):构造函数的继承 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继 ...

  10. 转:javascript面向对象编程

    作者: 阮一峰 日期: 2010年5月17日 学习Javascript,最难的地方是什么? 我觉得,Object(对象)最难.因为Javascript的Object模型很独特,和其他语言都不一样,初学 ...

随机推荐

  1. ERP财务管理有哪些功能?如何选择合适的ERP软件开发商定制开发适合自己的ERP财务管理?

    企业日常运营中,分工明确.结构清晰的财务管理非常重要,因此在完整的ERP解决方案中,财务管理是不可或缺的部分,甚至财务管理是整个ERP解决方案的核心,其它功能模块都围绕着财务管理构建价值链创造流程,最 ...

  2. PolarDB-X 全局Binlog解读之性能篇(上)

    简介: 本篇来介绍一下PolarDB-X全局binlog在性能方面的一些设计和思考,先通过几个实际的测试案例来展示全局binlog的性能情况,然后结合这些案例来深入讲解全局binlog关于优化的故事. ...

  3. 专访香侬科技:致力于让世界听到中文NLP的声音

    ​像所有的创业者一样,香侬科技的初创团队胸怀梦想,期待有一天当人们提起香侬的时候,除了"信息论之父",还能想起来有一家用技术在链接大千世界的科技公司--香侬科技. 新生的香侬科技选 ...

  4. 基于 Wasm 和 ORAS 简化扩展服务网格功能

    简介: 本文将介绍如何使用 ORAS 客户端将具有允许的媒体类型的 Wasm 模块推送到 ACR 注册库(一个 OCI 兼容的注册库)中,然后通过 ASM 控制器将 Wasm Filter 部署到指定 ...

  5. 深入分析 Flutter 渲染性能

    简介: Flutter 有很多优点,特别是对于开发者来说,跨平台多端支持,丰富的 UI 组件库和交互效果,声明式 UI,React 的更新方式,Hot-reload 提高开发效率等等.虽然它在渲染性能 ...

  6. 外部工具连接SaaS模式云数据仓库MaxCompute实战——商业BI分析工具篇

    简介: MaxCompute 是面向分析的企业级 SaaS 模式云数据仓库,以 Serverless 架构提供快速.全托管的在线数据仓库服务,消除了传统数据平台在资源扩展性和弹性方面的限制,最小化用户 ...

  7. 国内常用源开发环境换源(flutter换源,python换源,Linux换源,npm换源)

    国内开源镜像站点 大学 清华大学开源软件镜像站 (使用较多) 中国科学技术大学开源软件镜像 (使用较多) 浙江大学开源镜像站 (主要是各发行版Linux,pip等常用库) 哈尔滨工业大学开源镜像站 ( ...

  8. 4.k8s-配置网络策略 NetworkPolicy

    一.基本了解 官方文档:https://kubernetes.io/zh-cn/docs/concepts/services-networking/network-policies/基本了解: 1.网 ...

  9. HAL库移植RT-Thread Nano

    一.移植RT-Thread Nano准备 keil软件 CubeMx软件 STM32 CubeMx使用教程:https://www.cnblogs.com/jzcn/p/16313803.html S ...

  10. 从 Rollover+curator 到 ILM

    数据量增长,当前存在的问题: 查询与写入越来越慢,聚合的速度慢的离谱,聚合的数据量大一些的话,可能出现超时失败,甚至OOM 磁盘和内存资源以肉眼可见的速度快速消耗,甚至出现满载的情况 JVM频繁GC, ...