/*
        面向对象编程
            
            本质 创建一个对象
                 可以用 属性属性值的 方式 存储 数据参数
                        函数的参数 只能存储在形参之中 只能在函数内部使用 不能在函数外部直接调用
                 可以用 函数的形式 存储需要执行的程序内容
                 调用生成的对象,属性属性值就是需要的数据参数,函数方法就是需要执行的程序
    
            定义 属性属性值存储参数数据
                通过构造函数定义实例化对象
                    通过 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. 《Effective C#》系列之(零)——概要

    把全书的内容讲述完整可能需要很长时间,我可以先回答主要目录和核心的内容.如果您有任何特定问题或需要更详细的解释,请告诉我. <Effective C#>一书共包含50条C#编程建议,以下是 ...

  2. 1.css的初认识

    1.什么是CSS? Cascading Style Sheet 层叠级联样式表 CSS:表现层(美化网页) 字体.颜色.边距.高度.宽度.背景图片.网页定位.网页浮动.... 2.CSS发展史 CSS ...

  3. 牛客网-SQL专项训练17

    ①SQL查询中使用WHere子句指出的是:查询条件 ②Mysql中表student_table(id,name,birth,sex),查询重复姓名.重复次数,并按重复次数降序排列,正确的是(A)? 解 ...

  4. Fluid 助力阿里云 Serverless 容器极致提速

    简介: 本文展示了一个在 ASK 环境中运行 Fluid 的完整数据访问示例,希望能够帮助大家了解 Fluid 的使用体验.运行效果以及 Serverless 和数据密集型应用结合的更多可行性. 作者 ...

  5. 【云原生】拿下 Gartner 容器产品第一,阿里云打赢云原生关键一战!

    近日,Gartner 发布 2020 年公共云容器报告,据报告显示,阿里云和 AWS 拥有最丰富的产品布局,覆盖 9 项产品能力,并列排名第一. 据 Gartner 分析师评论,阿里云拥有丰富的容器产 ...

  6. 云上技术 | 混合云管理平台多Region架构

    简介: 随着现代化进程加速,企业业务规模和迭代速度也今非昔比,在已具备一定规模的中大型电力系统中,会面临着数字化升级的压力,包括复杂组织架构管理.计算资源弹性扩展.IT运维提效等需求.基于电力行业属性 ...

  7. [Go] go-nsq 使用指南

    首先你需要有一个 nsq 的服务端,nsq 由三部分构成:nsqd.nsqlookupd.nsqadmin. 快速启动 nsq 一个节点看这里:https://github.com/farwish/n ...

  8. WPF 已知问题 清空 CollectionView 的 SortDescriptions 可能抛出空异常

    本文记录一个 WPF 的已知问题,在通过 CollectionViewSource 获取到 CollectionView 之后,如果 CollectionViewSource 对象已被 GC 回收,将 ...

  9. GitHub 的 Action 接入 Stryker.NET 进行自动化测试单元测试鲁棒性

    假设有一个捣蛋的小伙伴加入了你的团队,这个捣蛋的小伙伴喜欢乱改代码,请问此时的单元测试能否拦住这些逗比行为?如果不能拦住逗比行为,是否代表着单元测试有所欠缺,或者有某些分支逻辑没有考虑到.本文将告诉大 ...

  10. Go语言基础(一)

    一.Go语言简介 Go即Golang,是Google公司2009年11月正式对外公开的一门语言 Go是静态强类型语言,是区别于解析型语言的编译型语言. 解析型语言--源代码是先翻译为中间代码,然后解析 ...