首页 > 其他分享 >js的中的函数(二)

js的中的函数(二)

时间:2023-07-06 15:35:18浏览次数:36  
标签:函数 对象 生成器 js 原型 Student 构造函数

构造函数

  JavaScript中,一个函数除了作为普通意义的函数外,还可以被用来定义为构造函数。什么是构造函数?就是可以用来生成一个对象的函数。例如:

  function Student(name,age,city,address){
      // this指向构造函数生成的对象
      this.name = name;
      this.age = age;
      this.city = city;
      this.address = address;
  }

  函数Student就是一个构造函数,函数名的首字母建议大写,以区别于普通函数。通过new 关键字,构造函数可以创建新的对象。

  var xiaoming = new Student("xiaoming",18,"shenzhen","nan shan");
  var xiaoping = new Student("xiaoping",19,"guangzhou","tian he");
  var xiaojia = Student("xiaojia",18,"shantou","long hu"); 

  xiaoming和xiaoqiang是我们通过构造函数创建的两个对象。以此,我们可以看出Student内部的关键字this指向当前的对象。构造函数虽然没有return语句,但是默认情况下,它返回的是this,也就是当前的对象。普通函数如果没有return语句返回undefined。如果不幸忘记写 new 关键字,那么函数返回的也是undefined。上述代码中的xiaojia变量,接收到的值就是undefined。

prototype属性

  构造函数通过prototype属性可以获取构造函数的原型。我们可以通过原型,动态地添加原型方法。例如:

Student.prototype.hello = function(){ 
  alert("Hello," + this.name);
}

上述代码所示,我们动态地给Student的原型添加了一个hello方法。

原型继承链

  JavaScript也是一种面向对象的语言。区别于Java语言的继承关系,JavaScript对象是通过原型来继承的。父对象、子对象、孙子对象之间的继承关系形成一个链条,我们称它为原型继承链。如下图所示:

  xiaoming对象指向它的原型对象,这个原型对象的构造函数是Student,Student称为这个原型对象的构造器(constructor)。

这个原型对象又是继承于另外一个原型对象,它是由Object构造生成的。

xiaoming.__proto__;  //xiaoming的原型对象
Student.prototype;   //Student作为原型对象的构造函数
xiaoming.__proto__ == Student.prototype; //true
xiaoming.__proto__.constructor == Student;//true
xiaoming.__proto__.__proto__ == Object.prototype;//true

生成器

  生成器也是一种特殊的函数,它提供了一种持续输出数据的能力。举一个斐波拉契生成器的例子如下:

  //生成器
  function* fib(n){
      a = 0;
      b = 1;
      for (let i=0;i < n;i++){
          yield a;
          [a,b] = [b,a+b];
      }
  }

上述fib()生成器的定义如下:

  • function*指出这是一个生成器的定义;
  • fib是生成器的名称;
  • (n)括号内列出生成器的参数,多个参数以逗号分隔;
  • { ... }之间的代码是函数体,可以包含若干语句。函数体内部的yield语句是生成器的核心,它表达 了这个生成器对外一个持续数据的输出。

调用生成器

  类似于函数的调用一样,我们用生成器的名称,后面紧跟括号和参数列表,对生成器进行调用。经过调用后的生成器才具有对外输出数据的能力。

  var g = fib(10);

通过next()函数,不断抽取它的输出

  var g = fib(10);
  g.next();  //{value:0,done:false}
  g.next();  //{value:1,done:false}

上述代码可知,next()函数返回一个对象。其中一个属性是value,表示返回值;另一个是done,表示抽取是否完成

生成器的遍历

  通过一次次调用next()获取生成器的值始终不太方便,我们可以通过for循环对生成器进行遍历。

  var g = fib(10);
  // 遍历生成器
  for (;;){
      let next = g.next();
      if (next.done){
          break;
      }
      console.log(next.value);
  }

  更方便的遍历方式是通过for...of...的迭代器

  var g = fib(10);
  for (let x of g){
      console.log(x);
  }

文章同时发表在:码农编程网 欢迎访问

本节重点:

  • 什么是构造函数,构造函数的特点;
  • 什么是原型链;
  • 生成器的定义和作用;
  • 如何调用生成器;
  • 生成器的遍历。

标签:函数,对象,生成器,js,原型,Student,构造函数
From: https://www.cnblogs.com/qqxz/p/17532273.html

相关文章

  • C++内存模型&空指针、野指针、函数指针和回调函数
    C++内存模型&空指针、野指针、函数指针和回调函数C++内存模型栈与堆的区别:1.管理方式不同栈是系统自动管理的,在超出作用域后,将自动被释放堆是手动释放,若程序中不释放,程序结束后将由操作系统回收2.空间大小不同堆的大小受限于物理内存范围栈小的可怜,一般为8M(可通过更改......
  • 第九篇 - SpringBoot统一结果封装Json数据
    前面几节学习了SpringBoot和Vue的结合,以及Vue跳转到另一个Vue页面。这节学习SpringBootcontroller返回Json数据格式封装。参考链接:https://zhuanlan.zhihu.com/p/347233348第一步:在entity文件夹下新建一个ResultVo类。 ResultVo.javapackagecom.example.demo.entity;p......
  • 认识soui4js(第5篇):使用扩展控件
    无论内置控件多么丰富,也不可能满足用户所有需求。总有时候用户需要自己扩展控件。soui4js推荐使用C++来扩展控件,然后通过实现一个js模块来提供js使用。扩展控件通常涉及到图形上下文的频繁交互,如果使用js来实现,效率上会大打折扣。使用C++,没了C++和js的相互调用。使用起来就和C++......
  • Go 语言函数
    函数定义与调用packagemainimport"fmt"funcmain(){/*定义局部变量*/varaint=100varbint=200varretint/*调用函数并返回最大值*/ret=max(a,b)fmt.Printf("最大值是:%d\n",ret)}/*函数返回两个数的最大值*/fun......
  • GIS融合之路(五)给CesiumJS加上体积云(Volumetric Cloud)和高度雾(Height Fog)
    同样在这篇文章开始前重申一下,山海鲸并没有使用ThreeJS引擎。但由于ThreeJS引擎使用广泛,下文中直接用ThreeJS同CesiumJS的整合方案代替山海鲸中3D引擎和CesiumJS整合。系列传送门:同样在这篇文章开始前重申一下,山海鲸并没有使用ThreeJS引擎。但由于ThreeJS引擎使用广泛,下文中直接......
  • 2023年7月最新全国省市区县和乡镇街道行政区划矢量边界坐标经纬度地图数据 shp geojso
    发现个可以免费下载全国 geojson 数据的网站,推荐一下。支持全国、省级、市级、区/县级、街道/乡镇级以及各级的联动数据,支持导入矢量地图渲染框架中使用,例如:D3、Echarts等geojson数据下载地址:https://geojson.hxkj.vip该项目github地址:https://github.com/TangSY/echarts-m......
  • 结构体,指针函数和数组初始化
    struct_m_malloc_dev{void(*init)(uint8_t);//初始化函数uint8_t(*perused)(uint8_t);//内存使用率uint8_t*membase[SRAMBANK];//内存池管理srambank个区域的内存uint16_t*memmap[SRAMBANK];//内存管理状态表uint8_tmemrdy[SRAMBANK];//内存管理......
  • scala class、Map、List 转换成Json(Gson、json4s、JSONUtil)
    实例代码importcn.hutool.json.JSONUtilimportcom.google.gson.GsonobjectEntitytoJsonTest{defmain(args:Array[String]):Unit={valgson=newGsonvalpeople=JJ("gl",12,List("basketball","baseball"),......
  • 一个C++11的线程函数
    一个C++11的线程函数#include<iostream>#include<thread>#include<chrono>voidprintNumbers(){for(inti=1;i<=100;++i){std::cout<<i<<std::endl;std::this_thread::sleep_for(std::chrono::millis......
  • js 实现文件下载并重命名
    JavaScript实现文件下载并重命名 第一种是HTML官网中的方法<ahref="/images/liang.jpg"download="文件名称">HTML5中a标签提供了一个filename属性,可以下载成指定的download属性名称这种同源访问是没有问题的,但一跨域就不行了,试了其它方法,不是报跨域错误,就是在当......