/*
        面向对象编程
            
            本质 创建一个对象
                 可以用 属性属性值的 方式 存储 数据参数
                        函数的参数 只能存储在形参之中 只能在函数内部使用 不能在函数外部直接调用
                 可以用 函数的形式 存储需要执行的程序内容
                 调用生成的对象,属性属性值就是需要的数据参数,函数方法就是需要执行的程序
    
            定义 属性属性值存储参数数据
                通过构造函数定义实例化对象
                    通过 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. pid循迹小车的实现,arduino

    帮我写一个Arduino循迹小车的程序,小车前面有并列8个红外发射接收传感器,每个红外发射接收传感器为1cm宽,地面循迹的线是大约2cm宽黑色的线,地面其他位置是白色的,要求循迹小车运行的速度快,使用 ...

  2. 01_Vue技术-Hello案例分析

    初始vue:       1.想让vue工作,就必须创建一个Vue实例,且要传入一个配置对象:       2.root容器里的代码依然符合html规范,只不过混入了一些特殊的vue语法:       ...

  3. 基于WASM的无侵入式全链路A/B Test实践

    简介: 我们都知道,服务网格(ServiceMesh)可以为运行其上的微服务提供无侵入式的流量治理能力.通过配置VirtualService和DestinationRule,即可实现流量管理.超时重试 ...

  4. 开源 Serverless 里程碑:Knative 1.0 来了

    ​简介:近期Knative发布了1.0版本,达到了一个重要的里程碑.Knative自2018年7月首次发布以来, 版本不断的迭代发展,除了无数的错误修复.稳定性和性能增强之外,按时间顺序还进行了一些改 ...

  5. 表格存储 SQL 查询多元索引

    ​简介: 多元索引是表格存储产品中一个重要的功能,多元索引使用倒排索引技术为表格存储提供了非主键列上的快速检索功能,另外也提供了统计聚合功能.表格存储近期开放了SQL查询功能,SQL引擎默认从原始表格 ...

  6. 6.prometheus监控--监控redis/rabbitmq/mongodb

    1.监控redis 1.1 redis_exporter安装方式 1.1.1 二进制源码安装方式 参考nginx二进制安装方法 redis_exporter下载地址:https://github.co ...

  7. C语言程序设计-笔记2-分支结构

    C语言程序设计-笔记2-分支结构 例3-1  简单的猜数游戏.输入你所猜的整数(假定1-100),与计算机产生的被猜数比较,若相等,显示猜中:若不等,显示与被猜数的大小关系. /*简单的猜数游戏*/ ...

  8. 简说Python之flask初体验

    目录 flask初体验 1.安装Flask 2.创建"Hello, World" Flask应用 3.执行结果 flask是python web的轻量框架,简单的几条命令就可以创建 ...

  9. Typora+免费图床,构建随处可用的Markdown文档

    Typora+PicGo+Gitee自动上传图片 视频教程: https://www.bilibili.com/video/BV1hT4y1f7Mf?from=search&seid=1546 ...

  10. 网络协议分析与抓包 TCP/IP UDP等

    学习地址: https://www.bilibili.com/video/BV1hV411U74y?p=4 https://www.bilibili.com/video/BV1S7411R7kF?p= ...