UBAINS

 找回密码
 立即注册
搜索
热搜: UBAINS
查看: 2082|回复: 0

[学习笔记] JavaScript构造函数

[复制链接]

10

主题

11

帖子

447

积分

版主

Rank: 7Rank: 7Rank: 7

积分
447
QQ
发表于 2020-10-28 18:02:59 | 显示全部楼层 |阅读模式
JavaScript构造函数

什么是构造函数


在 JavaScript 中,用 new 关键字来调用的函数,称为构造函数。这个过程叫做实例化。



为什么要使用构造函数


假如一台中控上控制了4台时序电源,每台时序电源有通道开关方法,通道状态,全开、全关、设备ID等属性和方法,但是方法执行的结果给属性有关联。一般思路的话可能要写很多函数方法和定义很多状态属性。
这时候构造函数的优势就体现出来了,我们将设备的功能和状态封装到一个函数里面,通过实例化来创建包含这些方法和状态的对象。


例子说明



  1. var name = "ubains"; //定义全局变量
  2. //定义一个构造函数 名字可以任意 好习惯 构造函数通常首字母大写 普通函数首字母小写
  3. function Power(port, len){
  4.     //this 在实例化时总是指向自身这个对象
  5.     this.port =port || "COM8"; //定于一个属性并赋传入的参数
  6.     //如果传入的port为空就赋值默认值 COM8
  7.     this.len =len; //this.xxxx  xxxx可以是任何名字
  8.     // 如果同名后面的覆盖前面的,也就是重新赋值了,所以属性值可以赋值任意类型
  9.     this.open = function(chs) { //定义一个方法
  10.         console.log("open channel " +chs);
  11.     }
  12.     this.info = function() {
  13.         console.log("port " + this.port); //this指向自身,这里this.port就是上面定义的属性
  14.         console.log("max channel " + this.len);
  15.     }
  16.     console.log("new run one"); //每次实例化过程中都会执行
  17.     varlength = len; //可以定义局部变量 实例化后清除 除非闭包中使用到
  18.     console.log(name); //可以调用全局变量
  19.     if(name.length){ //可以在实例化过程中进行逻辑运行
  20.         console.log("this is ubains");
  21.         this.name =name; //例如根据值 为对象添加额外属性
  22.     } else{
  23.         console.log("No parameters");
  24.     }
  25.     this.arr = new Array(this.len); //属性可以是其他构造函数实例化的对象
  26.     //Array构造函数里面执行完后 再执行到这里
  27.     this.status ={
  28.         channel: 1,
  29.         name: "1",
  30.         get: function () {
  31.            //这里的 this 不指向构造函数,指向 this.status 这个对象
  32.            console.log(this.port); //undefined
  33.            console.log(this); //{ channel: 1, name: '1',get: [Function: get] }
  34.         }
  35.     }
  36. }

  37. vardev1 = new Power("COM1", 8); //实例化
  38. vardev2 = new Power("COM2", 8); //实例化
  39. vardev3 = new Power("", 8); //实例化 传入空将默认赋值为 COM8
  40. vardev4 = new Power("COM4", 12); //实例化

  41. console.log(dev1); //打印如下
  42. // Power {
  43. //    port: 'COM1',
  44. //    len: 8,
  45. //    open: [Function],
  46. //    info: [Function],
  47. //    name: 'ubains',
  48. //    arr: [ <8 empty items> ],
  49. //    status: { channel: 1, name: '1', get: [Function: get] }
  50. //   }


  51. console.log(dev4); //打印如下
  52. // Power {
  53. //    port: 'COM4',
  54. //    len: 12,
  55. //    open: [Function],
  56. //    info: [Function],
  57. //    name: 'ubains',
  58. //     arr: [ <12 empty items> ],
  59. //    status: { channel: 1, name: '1', get: [Function: get] }
  60. //   }
  61. //因为传入参数不一样,里面的属性值不一样。


  62. console.log(dev1.port); //获取属性值
  63. dev1.port = "NET1"; //设置属性值
  64. console.log(dev4.port); // COM4
  65. //实例化后每个对象是独立空间,互不影响,

  66. dev1.open(1); //调用方法 传参并执行
  67. dev1.open = function(chs) { //给方法重新赋值 方法重写
  68.     console.log("port = " + this.port); //这里的this其实指向dev1
  69.     console.log("port = " +dev1.port); //所以你也可以写成这样 推荐用this 便于复用
  70.     console.log("open all channel");
  71.     console.log("Adults want it " +chs);
  72. }
  73. dev1.open("all"); //重新调用就会执行上面的方法

  74. dev1.status.get(); //this 指向问题 构造函数中的this.status
复制代码


高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

Archiver|手机版|小黑屋|BBS.UBAINSYUN.COM

GMT+8, 2024-4-25 21:54 , Processed in 0.036011 second(s), 19 queries .

Powered by UBAINS! X3.4

© 2001-2017 UBAINS Inc.

快速回复 返回顶部 返回列表