ES6类-继承-Symbol-模版字符串

news2024/11/16 4:35:53

目录

 继承

ES5 如何继承

ES6继承

Symbol

用途

可以产生唯一的值,独一无二的值

解决命名冲突

getOwnPropertySymbols()

 作为全局注册表 缓存  Symbol.for()

 消除魔术字符串

 模版字符串


在javascript语言中,生成实例对象使用构造函数;ES6提供了类Class这个概念,作为对象的模板。定义一个类通过class关键字,ES6的类可以看成是构造函数的另一种写法。

class Person{
    constructor(name,age,gender){
        // 类构造器中属性和方法是实例私有属性和私有方法
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
    // 实例公共方法 类似于存放在Person类原型对象中
    sayName(){
        console.log(this.name);
    }
    test = 'hello'; //实例公共属性
    friends = [];  //实例私有属性
    // 类静态属性和静态方法
    static personAttr = '类的静态属性';
    static personMethod = function(){
        console.log('类静态方法this指向类本身');
        console.log(this,this.personAttr,this.test,this.friends);
    }
}
let p1 = new Person('可乐',12,'male');
let p2 = new Person();
console.log(p1.test,p2.test);
console.log(p1.test === p2.test);
p1.friends.push('tom');
console.log(p1.friends,p2.friends);
console.log(p1.friends === p2.friends);
Person.personMethod();

 继承

ES5 如何继承

实例使用属性和方法
  1.从实例对象本身查找属性或者方法
  2.如果实例没有,从构造函数的原型对象中找
  3.如果还没有,从父构造函数的原型对象中找

/**
 * es5 继承 
 * 经典继承 原型链继承
 */
// function Animal(name,age,length,weight){
// 	this.name = name;
// 	this.age = age;
// 	this.length = length;
// 	this.weight = weight;
// }
// Animal.prototype = {
// 	constructor:Animal,
// 	sayType(){
// 		console.log(this.type)
// 	}
// }
// function Dog(name,age,length,weight,type){
// 	// 继承父构造函数属性  借用构造函数继承 经典继承
// 	Animal.call(this,name,age,length,weight);
// 	this.type = type;
// }
// // 原型链继承 子类得原型对象指向父类得实例 
// Dog.prototype = new Animal();
// Dog.prototype.constructor = Dog;
// let d1 = new Dog('可乐',12,'40cm','10kg','狗');
// d1.sayType();
// console.log(d1);

更详细的ES5继承见面向对象之创建对象模式和继承模式_学前端的狗头苏丹的博客-CSDN博客

ES6继承

class可以通过extends关键字实现继承,子类可以没有构造函数,系统会默认分配。子类提供了构造函数则必须要显式调用super。super函数类似于借用构造函数。类似于Animal.call()

1.子类对象指向父类对象

2.子类原型对象继承父类原型对象

/**
 * ES6继承 使用extends关键字实现继承
 */
class Animal{
    // 构造器属性 实例私有属性
    constructor(name,age,length){
        this.name = name;
        this.age = age;
        this.length = length;
    }
    // 类体方法 实例公共方法  存放在Animal.prototype中
    sayName(){
        console.log(this.name);
    }
    test = 'hello';
    friends = [];
    // 静态属性和静态方法
    static ParentAttr = '父类属性';
    static ParentMethod = function(a){
        console.log('父类的方法');
        return a instanceof Animal;
    }
}
// 子类继承父类     不提供constructor的情况
class Dog extends Animal{

}
let d1 = new Dog('可乐',12,'50cm');
console.log(d1);
d1.sayName();
d1.friends.push('tom')
console.log(d1.test,d1.friends,d1);
console.log(Dog.ParentAttr);
console.log(Dog.ParentMethod(d1));

// 子类继承自父类
console.log(Dog.__proto__ === Animal);
// 子类原型对象继承自父类的原型对象
console.log(Dog.prototype.__proto__ === Animal.prototype);

// 子类如果提供了构造器 必须显示调用super
// class Dog2 extends Animal{
//     constructor(name,age,weight,type,color){
//         super(name,age,weight); //相当于调用父类构造器  Animal.call()
//         this.type = type;
//         this.color = color;
//     }
//     sayName(){
//         console.log(this.name,'子类实例公共方法');
//     }
// }
// let d2 = new Dog2('可乐',12,'50cm','狗','黑色');
// console.log(d2);
// d2.sayName();

Symbol

ES6引入的一种新的原始数据类型Symbol,表示独一无二的值。Symbol函数可以接受参数,表示对于这个唯一值的描述。属于基本数据类型,Symbol()函数会返回symbol类型的值

参数:字符串 表示对这个symbol值的描述

用途

可以产生唯一的值,独一无二的值

let sy1 = Symbol();
let sy2 = Symbol();
console.log(sy1,sy2,sy1 === sy2,sy1.toString());

let a = new Number();
let b = new String();
console.log(a,b);

解决命名冲突

let sy3 = Symbol('name'); //接收的字符串 对symbol的描述
let sy4 = Symbol('age');
let obj = {
    name:'zhangsan',
    age:12,
    [sy3]:'terry',
    [sy4]:18,
    [Symbol('email')]:"443119974@qq.com"
}
console.log(obj);
for(let key in obj){
    console.log(key);
}

 

getOwnPropertySymbols()

 从上图输出结果来看:我们可以发现for in循环无法遍历到symbol值作为属性名对应的属性,我们想要获取所有的symbol值对应的属性,,则需要使用getOwnPropertySymbols()方法

/**
 * 获取所有的symbol值对应的属性
 * getOwnPropertySymbols
 */
console.log(Object.getOwnPropertySymbols(obj));
let s = Object.getOwnPropertySymbols(obj);  //[ Symbol(name), Symbol(age), Symbol(email) ]
console.log(obj[s[2]]);

 

 作为全局注册表 缓存  Symbol.for()

全局注册表
Symbol() 不同的是,用 Symbol.for() 方法创建的的 symbol 会被放入一个全局 symbol 注册表中。Symbol.for() 并不是每次都会创建一个新的 symbol,它会首先检查给定的 key 是否已经在注册表中了。假如是,则会直接返回上次存储的那个。否则,它会再新建一个。

/**
 * 3.作为全局注册表 缓存 Symbol.for()
 */
// 将symbol放到全局注册表中
let sy5 = Symbol.for('hello');
let sy6 = Symbol.for('hello');
console.log(sy5 === sy6);       //true

// 每次都会创建一个不同symbol值  虽然描述符一样 但是Symbol value值不一样
let sy7 = Symbol('hello');
let sy8 = Symbol('hello');
console.log(sy7 === sy8);       //false

// Symbol.keyFor()可以检测symbol值是否在全局注册表中注册过。 返回对于symbol的描述或者undefined
console.log(Symbol.keyFor(sy5));
console.log(Symbol.keyFor(sy6));
console.log(Symbol.keyFor(sy7));

Symbol.keyFor()可以检测symbol值是否在全局注册表中注册过。 返回对于symbol的描述或者undefined 

 消除魔术字符串

魔术字符串指的是,在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。

/**
 * 4.消除魔术字符串
 */
function getArea(shape,options){
    let area = 0;
    switch(shape){
        case Shape.SJX:
            area = .5 * options.height * options.width;
            break;
        case Shape.ZFX:
            area = options.height * options.width;
            break;
        case Shape.CIRCLE:
            area = Math.PI * options.r * options.r;
            break;
        default:
            area = -1;
    }
    return area;
}
const Shape = {
    SJX:Symbol('三角形'),
    ZFX:Symbol('正方形'),
    CIRCLE:Symbol('圆'),
}
let res = getArea(Shape.SJX,{height:100,width:100,r:50})
console.log(res);

Shape.SJX = Symbol('六边形');
console.log(Shape);

 模版字符串

模板字面量是用反引号(`)分隔的字面量,允许多行字符串、带嵌入表达式的字符串插值和一种叫带标签的模板的特殊结构。

模板字面量有时被非正式地叫作模板字符串,因为它们最常被用作字符串插值(通过替换占位符来创建字符串)。然而,带标签的模板字面量可能不会产生字符串——它可以与自定义标签函数一起使用,来对模板字面量的不同部分执行任何操作。

/**
 * 模版字符串 可以解析变量
 */
let name = 'zhangsan';
let age = 12;
// let str = 'name' + 'age';
let str = `${name}+${age}`
console.log(str);

let id = 1;
let url = `121.199.0.35:8888/findById?id=${id}`;
console.log(url);

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/757543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库基本操作-----数据库用户管理和授权

目录 一、数据库用户管理 1.新建用户 2.查看用户信息 3.重命名用户 4.删除用户 ​编辑5.修改当前登录用户密码 6.修改其他用户密码 7.忘记 root 密码的解决办法 (1)修…

Redis数据类型 — List

List 列表是简单的字符串列表,按照插入顺序排序,可以从头部或尾部向 List 列表添加元素。 List内部实现 List 类型的底层数据结构是由双向链表或压缩列表实现的: 如果列表的元素个数小于 512 个(默认值,可由 list-m…

详解Single-Shot Alignment Network (S2A-Net) 基于遥感图像的特征对齐旋转目标检测

引言 目标检测:把图像中的物体使用方框标记起来,不同类别物体应使用不同颜色 目标检测其实是寻找物体边界框(bounding box)回归问题(regression)和对物体分类问题(classification)的统一 遥感目标检测:普通的目标检测是日常生活中的横向的图…

2.4 线性表的插入删除

1. 链表的插入删除 1. 单链表插入删除 图1. 单链表插入结点 图2. 单链表删除结点 #include <iostream>typedef struct LNode {int data;struct LNode* next; }LNode;/// <summary> /// 判断链表是否非空 /// </summary> /// <param name"p">…

常见关于数组的函数的介绍

关于字符串函数的介绍 求字符串长度 strlen函数 用于计算字符串的长度的函数&#xff0c;需要使用的库函数是string.h 函数声明 size_t strlen(const char *str)函数模拟实现 #include<stdio.h> #include<assert.h> size_t my_strlen(const char* arr) {asse…

review回文子串

给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 class Solution {List<List<String>> lists new ArrayList<>(); // 用于存储所有可能…

阿里瓴羊One推出背后,零售企业迎数字化新解

配图来自Canva可画 近年来随着数字经济的高速发展&#xff0c;各式各样的SaaS应用服务更是层出不穷&#xff0c;但本质上SaaS大多局限于单一业务流层面&#xff0c;对用户核心关切的增长问题等则没有提供更好的解法。在SaaS赛道日渐拥挤、企业增长焦虑愈演愈烈之下&#xff0c…

Midjourney助力交互设计师设计网站主页

Midjourney的一大核心优势是提供创意设计&#xff0c;这个功能也可以用在网站主页设计上&#xff0c;使用Midjourney prompt 应尽量简单&#xff0c;只需要以"web design for..." or "modern web design for..."开头即可 比如设计一个通用SAAS服务的初创企…

单片机第一季:零基础5——LED点阵

1&#xff0c;第八章-LED点阵 如何驱动LED点阵&#xff1a; (1)单片机端口直接驱动。要驱动8*8的点阵需要2个IO端口&#xff08;16个IO口&#xff09;、要驱动16*16的点阵需要4个IO端口&#xff08;32个IO口&#xff09;。 (2)使用串转并移位锁存器驱动。要驱动16*16点阵只需要…

Linux 系统编程-开发环境(二)

目录 7 压缩包管理 7.1 tar 7.2 rar 7.3 zip 8 进程管理 8.1 who 8.2 ps 8.3 jobs 8.4 fg 8.5 bg 8.6 kill 8.7 env 8.8 top 9 用户管理 9.1 创建用户 9.2 设置用户组 9.3 设置密码 9.4 切换用户 9.5 root用户 9.6 删除用户 10 网络管理 10.1 i…

MySQL-分库分表详解(七)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

【熬夜送书 | 第二期】清华社赞助 | 《前端系列丛书》

前端是什么? 前端&#xff08;Front-End&#xff09;&#xff0c;又称浏览器端、客户端等&#xff0c;是指 Web 应用程序中负责用户交互、界面展示和数据展示的部分。前端技术体系主要包括 HTML、CSS 和 JavaScript 等内容。 其中&#xff0c;HTML&#xff08;Hypertext Mar…

❀如何获得铁粉❀

文章目录 引言一、提供独特的价值1.1 分享专业知识和经验1.2 提供独特的产品或服务1.3 展示个人风格和个性 二、构建真实的关系2.1 回应评论和互动2.2 分享个人故事和经历2.3 建立信任和互信关系 三、提供独家福利3.1 提供折扣和促销3.2 推出限量版产品或服务3.3 独家活动和会员…

位运算常见算法题

文章目录 前言191. 位1的个数338. 比特位计数461. 汉明距离136. 只出现一次的数字260. 只出现一次的数字 III面试题 01.01. 判定字符是否唯一268. 丢失的数字371. 两整数之和137. 只出现一次的数字 II面试题 17.19. 消失的两个数字 前言 本篇文章会涉及多道位运算题目&#xf…

图像处理学习笔记(一)

目录 图像处理学习笔记&#xff08;一&#xff09;一、基础知识1、彩色图像&#xff08;1&#xff09;RGB&#xff08;2&#xff09;HSV&#xff08;3&#xff09;HSI&#xff08;4&#xff09;CMYK&#xff08;5&#xff09;YUV&#xff08;6&#xff09;YCbCr 2、灰度图像3、…

谋合作、创新境 | 百度参观图为科技生产全链路

当代科技的发展不断催生出新的变革和机遇&#xff0c;百度作为全球顶尖的高科技公司&#xff0c;凭借其强大的创新基因&#xff0c;一直处于人工智能领域的最前沿。   近日&#xff0c;百度公司派出了一支专业团队来到了图为科技&#xff0c;对图为的研发技术及生产线进行了全…

python 把txt文本的log日志倒序处理

在上述代码中&#xff0c;我们尝试了一系列常见的编码&#xff08;utf-8、gbk、latin-1&#xff09;来打开文件&#xff0c;直到找到一个能够成功解码文件内容的编码。 如果找到了匹配的编码&#xff0c;就使用该编码读取文件内容。如果仍然出现解码错误&#xff0c;你可能需要…

虚幻Voxel插件

虚幻Voxel插件 Voxel Plugin Voxel Plugin brings smoothed voxel terrain to Unreal Engine 4. Generate, destroy and terraform the world! 体素插件可以在虚幻引擎中生成平滑的体素地形。创造、破环和改造世界。 Terrain generation and terraforming both in game and i…

CANOE 操作详情

canoe 手把手教你如何操作canoe工具&#xff1a; 1&#xff1a;创建test文件夹&#xff0c; 并在文件夹下创建3 文件夹 2&#xff1a;创建canoe工程&#xff0c;选择500波特率 3: 双击后进入 4&#xff1a;创建DBC文件 5 创建网络节点&#xff1a; 两个节点创建好之后&#x…

mpVue 微信小程序基于vant-weapp 组件的二次封装TForm 表单组件(适配移动端)——新增仓库地址

一、前言 1、mpVue微信小程序不支持动态组件&#xff08;<component> &#xff09; 2、mpVue微信小程序不支持动态属性及事件穿透&#xff08;$attrs和$listeners&#xff09; 3、mpVue微信小程序不支持render函数 二、最终效果 三、配置参数&#xff08;Attributes&…