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

    "感谢您阅读本篇博客!如果您觉得本文对您有所帮助或启发,请不吝点赞和分享给更多的朋友.您的支持是我持续创作的动力,也欢迎留言交流,让我们一起探讨技术,共同成长!谢谢!" 代码 im ...

  2. 【Oracle】 管道函数pipelined function简单的使用

    Oracle 管道函数pipelined function简单的使用 如果在函数(function)中加关键字 pipelined,就表明这是一个oracle管道函数,其返回值类型必为 集合,体现出来 ...

  3. 力扣319(java)-灯泡开关(中等)

    题目: 初始时有 n 个灯泡处于关闭状态.第一轮,你将会打开所有灯泡.接下来的第二轮,你将会每两个灯泡关闭第二个. 第三轮,你每三个灯泡就切换第三个灯泡的开关(即,打开变关闭,关闭变打开).第 i 轮 ...

  4. ACK正式支持对基于Alibaba Cloud Linux操作系统的集群进行等保加固

    简介: 我们对基于Alibaba Cloud linux操作系统的ACK集群进行等保加固,意味着阿里云在云产品开发和交付的过程中将安全作为重要组成部分,将合规融入到产品的"血液"中 ...

  5. [php-src] Php扩展开发的琐碎注意点、细节

    内容均以php-5.6.14为例. 函数中接收的字符串参数长度不包含结尾的0,在 zend_update_property 中,长度的参数是 int len,一般都使用 ZEND_STRL(NAME) ...

  6. LLM应用实战:当KBQA集成LLM(二)

    1. 背景 又两周过去了,本qiang~依然奋斗在上周提到的项目KBQA集成LLM,感兴趣的可通过传送门查阅先前的文章<LLM应用实战:当KBQA集成LLM>. 本次又有什么更新呢?主要是 ...

  7. hbuilder打包报错:java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 7 column 15 path $.icons

    一个棘手的问题,在网上找几乎没有出现这样的案例,个别也只有翻译没有解决方式,,,,,自己研究一番发现这实际上都不算是个问题 这句话翻译:这个位置应该是个对象而不是数组,解决方法: 在manifest. ...

  8. Go-Zero微服务快速入门和最佳实践(一)

    前言 并发编程和分布式微服务是我们Gopher升职加薪的关键. 毕竟Go基础很容易搞定,不管你是否有编程经验,都可以比较快速的入门Go语言进行简单项目的开发. 虽说好上手,但是想和别人拉开差距,提高自 ...

  9. SHELL脚本获取域名对应的IP地址

    单个获取 编写角本pingip.sh #!/bin/sh ADDR=qq.com TMPSTR=`ping ${ADDR} -c 1 | sed '1{s/[^(]*(//;s/).*//;q}'` ...

  10. LVS负载均衡(5)-- LVS持久连接

    持久连接: 持久连接用于实现无论使用任何调度算法,在一段时间内(默认300s ),能够实现将来自同一个地址的请求始终发往同一个RS. 语法格式: ipvsadm -A|E -t|u|f service ...