当前位置: 首页 > news >正文

类与对象以及原型机制

抽取对象共用的属性和行为封装成类

对象:在JavaScript中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象(属性+方法)

类:泛指某一大类(class)
对象:通过实例化的一个具体对象

constructor构造函数

constructor()方法是类的构造函数(默认方法),用于传递参数,返回实例对象,通过new命令生成对象实例时,自动调用该方法

<script>
class Father{
   constructor(x,y){
     this.x=x;
     this.y=y;
  }
  info(){
      console.log(this.x+this.y);
   }
}

var y=new Father(2,4);
y.info();       //6

</script>

继承(extends)

子类可以继承父类的一些属性和方法

super关键字
super关键字用于访问和调用对象父类上的函数。可以调用父类的构造方法,也可以调用父类的普通函数

注意:子类在构造函数中使用super,必须放到this前面(必须先调用父类的构造方法,再使用子类的构造方法)

1.在ES6中,先定义类,才能通过类实例化对象
2.类里面的共有的属性和方法一定要加this使用

子类继承父类的构造方法

<script>
class Father{
   constructor(x,y){
     this.x=x;
     this.y=y;
  }
  info(){
      console.log(this.x+this.y).
   }
}

class Son extends Father{

}

var e = new Son(2,4);
e.info();

</script>
<script>
        class Father{
           constructor(x,y){
             this.x=x;
             this.y=y;
          }
          info(){
              console.log(this.x+this.y);
           }
        }
        
        class Son extends Father{
          constructor(x,y){

              //倘若子类已有构造函数,要想使用父类的方法,需使用super()
            super(x,y);  
          }
        }
        
        var e = new Son(2,4);
        e.info();
        
        </script>

子类继承父类的普通方法

<script>
        class Father{
           money(){
             return '年薪百万';

           }

        }

        class Son extends Father{
            money(){
                //继承父类中money()的普通方法
                console.log(super.money()+'我也可以');
            }
        }


        var t = new Son();
        t.money();

    </script>

综合

class Father{
            constructor(name){
               this.name=name;
            //    this.age=age;

            }

            info(){

                return this.name+'今年';
            }

        }

        class Son extends Father{
            constructor(name,age){
                super(name);
                // this.name=name;
                this.age=age;

            }
            info(){
                console.log(super.info()+this.age+'了');
            }b

        }
        var d = new Son('wzm',22);
        d.info();      //wzm今年22

——————————————————
在ES6之前,对象不是基于类创建的,而是用一种构造函数的特殊函数来定义对象和他们的特征

构造函数是一种特殊的函数,用来初始化对象,即为对象成员变量赋初始值,它总与new 一起使用

在js中,使用构造函数要注意:
1.构造函数用于创建某一类对象,其首字母要大写
2.构造函数要和new 一起使用才有意义

new 在执行时会做四件事
1.在内存中创建一个新的空对象
2.让this指向这个新对象
3.执行构造函数里面的代码,给这个新对象添加属性和方法
4.返回这个新对象(因此构造函数里面不需要return)

实例成员只能通过实例化对象访问
静态成员只能通过构造函数访问

function Start(name,age){
      this.name=name;
      this.age=age;
      this.skill=function(){
           console.log('敲代码')
       }
}

var g=new Start('wzm',22);
//动态
console.log(g.name);   //wzm
console.log(g.age);    //22
g.skill();
//静态
Start.sex='男';
console.log(Start.sex)    //男
console.log(g.sex)      //undefined

构造函数在创建对象时存在内存浪费的问题(主要是公共方法引起的)
创建一个对象就会占用一个内存地址,因此同一构造函数创建的对象,它们不相等

构造函数原型prototype

构造函数通过原型分配的函数是所有对象所共享的
JavaScript规定,每一个构造函数都有一个prototype属性,指向另一个对象。(这个prototype就是一个对象,这个对象的所有属性和方法,都会被构造函数所拥有)

一般情况,公共属性定义到构造函数里面,公共方法放到原型对象上

Start.prototype.skill=function(){
    //解决了内存浪费
    console.log('敲代码')}
<script>
        function Start(name,age){
              this.name=name;
              this.age=age;
            //   this.skill=function(){
            //        console.log('敲代码')
            //   }
             console.log(this.name+'今年'+this.age+'了');
        }
        Start.prototype.skill=function(){
            //解决了内存浪费
            console.log('敲代码');
        }
        
        var g=new Start('wzm',22);
        var y=new Start('lzy',18);

        //验证是否占用空间
        console.log(g.skill === y.skill)
   </script>

原型:一个对象,成为prototype为原型对象
原型的作用:共享方法

对象原型_proto_

对象都会有一个属性_proto_指向构造函数的prototype原型对象,对象能是用构造函数prototype原型对象的属性和方法,就是因为对象有_proto_原型的存在

对象._proto===构造函数._prototype_    //true

相关文章:

  • IMX6ULL学习笔记(6)——通过USB OTG烧录U-Boot(MfgTool工具)
  • 牛客 NC25005 [USACO 2008 Ope S]Clear And Present Danger
  • 洛谷 P2349:金字塔 ← 链式前向星 dfs
  • Flink—窗口、时间和水印
  • Cadence OrCAD Capture 查找功能详细介绍
  • 物联网病毒Mirai可靠性分析
  • c语言实现数据结构中的单向链表
  • (没学懂,待填坑)【动态规划】数位动态规划
  • 小功能⭐️Unity判断是否单击到了UI
  • 常见的传输介质及其特性
  • 660——第一章
  • vue中计算属性computed的特性和应用
  • UAC实现原理
  • 【通信】Matlab实现多同步压缩变换
  • Element常用api webview
  • 网络传输文件的问题
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • android 一些 utils
  • angular2 简述
  • gulp 教程
  • IOS评论框不贴底(ios12新bug)
  • js继承的实现方法
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Node项目之评分系统(二)- 数据库设计
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Vue2.0 实现互斥
  • 马上搞懂 GeoJSON
  • 码农张的Bug人生 - 见面之礼
  • 排序算法之--选择排序
  • 微信小程序设置上一页数据
  • 译有关态射的一切
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 容器镜像
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​queue --- 一个同步的队列类​
  • ​虚拟化系列介绍(十)
  • (C语言)二分查找 超详细
  • (js)循环条件满足时终止循环
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (转)关于多人操作数据的处理策略
  • .NET BackgroundWorker
  • .net 设置默认首页
  • .net 微服务 服务保护 自动重试 Polly
  • .NetCore部署微服务(二)
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .NET连接MongoDB数据库实例教程
  • .NET委托:一个关于C#的睡前故事
  • .net中的Queue和Stack
  • @Autowired注解的实现原理
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...