ECMAScript 6+ 新特性 ( 二 )

这篇具有很好参考价值的文章主要介绍了ECMAScript 6+ 新特性 ( 二 )。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

2.12. class类

ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过 class 关键字,可以定义类。

ES6 的 class 可以看作只是一个语法糖,它的绝大部分功能ES5 都可以做到,新的 class 写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。

// ES 5
// 人员 : 相当于 构造方法
function Person(name, sex){
    this.name = name;
    this.sex = sex;
}

//添加方法
Person.prototype.sayHi = function(){
    console.log("大家好!!");
}

//实例化对象
let wang = new Person('王小二', '男');
wang.sayHi();
console.log(wang);



// ES 6
//class
class Emp{
    //构造方法 名字不能修改
    constructor(name, sex){
        this.name = name;
        this.sex = sex;
    }

    //方法必须使用该语法
    sayHi(){
        console.log("大家好!!");
    }
}

let li = new Emp("李小三", '女');
li.sayHi()
console.log(li);

2.12.1.set/get 方法

在name属性之前添加了get和set关键字,这样就创建了一个名为name的访问器属性。get方法用于获取该属性的值,set方法用于设置新的值。

需要注意的是,使用属性访问器时,实际的属性名会在内部使用一个带下划线的变量名来存储。这是一种常见的命名约定,用于区分属性访问器和实际存储属性的变量。

 class Stu {
     constructor(name) {
         this._name = name;
     }

     get name() {
         console.log('读取 name 属性')
         return this._name;
     }

     set name(newName) {
         console.log('修改 name 属性');
         this._name = newName;
     }
 }

const stu = new Stu('王小二');
console.log(stu.name); // 输出 "王小二"

stu.name = '李小三';
console.log(stu.name); // 输出 "李小三"

2.12.2.静态

static 属于 类不属于 对象

// ES 5

// function Stu(){
//
// }

// 下面定义的属性方法属性 Stu , 相当于 静态的
// name 属性 , 比较特殊 为  Stu
// Stu.age = 12;
// Stu.sayHello = function(){
//     console.log("hello, 我是王小二");
// }
// console.log(Stu.age)
// Stu.sayHello();

// Stu.prototype.sex = '男';
//
// let wang = new Stu();
// //  这些属性是属于 Phone 的, 而不是属于 wang 的
// console.log(wang.name);
// wang.sayHello();
// console.log(wang.sex);


// ES 6
class Stu{
    //静态属性
    static name = '李小三';
    static sayHello(){
        console.log("hello, 我是李小三");
    }
}

let li = new Stu();
console.log(li.name);
// li.sayHello();
console.log(Stu.name);
Stu.sayHello();

2.12.3.继承

2.12.3.1.ES 5 构造继承
// ES 5
// 人员 父类
function Person(name, sex){
    this.name = name;
    this.sex = sex;
}

//添加方法
Person.prototype.sayHi = function(){
    console.log("大家好!!");
}

//员工 子类 , 增加了 salary 薪水 属性
function Employee(name, sex, salary){
    // 调用父类的构造函数, 将自己及属性值 传入
    Person.call(this, name, sex);
    this.salary = salary;
}

//设置子级构造函数的原型
Employee.prototype = new Person;
Employee.prototype.constructor = Employee;

//声明子类的方法
Employee.prototype.eat = function(){
    console.log("去食堂")
}



const wang = new Employee('王小二', '男',6499 );

console.log(wang);
console.log(wang.name);
console.log(wang.sex);
console.log(wang.salary);
wang.sayHi();
wang.eat()

在这段代码中,EmployeePerson 的子类。以下是这两句代码的含义:

  1. Employee.prototype = new Person; 这行代码的作用是将 Person 构造函数的一个实例赋值给 Employee 原型对象。通过这样做,所有 Employee 类的实例都将继承 Person 类的所有方法和属性(通过原型链)。在这里调用 new Person 时并没有传入参数,因此新创建的 Person 实例的 namesex 属性将是 undefined。不过,在接下来的 Employee 构造函数内部已经通过 Person.call(this, name, sex) 正确地设置了这些属性。
  2. Employee.prototype.constructor = Employee; 在 JavaScript 中,每个构造函数的原型对象都有一个内置的 constructor 属性,它指向该构造函数本身。但是,当执行了 Employee.prototype = new Person 后,Employee 原型对象的 constructor 被修改为指向 Person。为了修复这一问题,并确保 Employee 的实例能够正确识别其构造函数,需要手动设置 Employee.prototype.constructorEmployee。这样做的目的是在后续可能涉及检查对象构造函数的场景下(如 instanceof 操作符或 .constructor 属性),能正确识别出对象是由哪个构造函数创建的。
2.12.3.2.ES 6 构造继承
// ES 6
class Person {
    //构造方法
    constructor(name, sex){
        this.name = name;
        this.sex = sex;
    }

    //父类的成员方法
    sayHi(){
        console.log("大家好!!");
    }
}

class Employee extends Person {
    //构造方法
    constructor(name, sex, salary) {
        super(name, sex);// Phone.call(this, brand, price)
        this.salary = salary;
    }

    eat() {
        console.log("去食堂")
    }

    // sayHi(){
    //     console.log("大家好!!我转正了");
    // }
}

const li = new Employee('李小三', '女', 5799 );
console.log(li);
console.log(li.name);
console.log(li.sex);
console.log(li.salary);
li.sayHi();
li.eat()

2.12.4.( ES 11 )私有属性

通过 在属性前加 # 来设置私有的属性,

在内部可以直接使用( 如: info() ),

在外部直接调用 会报错 , Uncaught SyntaxError: Private field ‘#age’ must be declared in an enclosing class文章来源地址https://www.toymoban.com/news/detail-832581.html

class Person{
     //公有属性
     name;
     //私有属性
     #age;
     #weight;
     //构造方法
     constructor(name, age, weight){
         this.name = name;
         this.#age = age;
         this.#weight = weight;
     }

     info(){
         console.log(this.name);
         console.log(this.#age);
         console.log(this.#weight);
     }
 }

//实例化
const girl = new Person('李小三', 18, '45kg');

console.log(girl.name); // 李小三
console.log(girl.#age); // Uncaught SyntaxError: Private field '#age' must be declared in an enclosing class
console.log(girl.#weight); // Uncaught SyntaxError: Private field '#weight' must be declared in an enclosing class

girl.info();

到了这里,关于ECMAScript 6+ 新特性 ( 二 )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 3分钟搞懂:JavaScript 和 ECMAScript

    ECMAScript 是 JavaScript 语言的 国际标准 ,JavaScript 是 ECMAScript 的 一种实现 (Adobe ActionScript 和 JScript 同样实现了 ECMAScript)。 ECMAScript 是欧洲计算机制造商协会 ECMA(European Computer Manufacturers Association)发布的浏览器脚本语言标准。它是 262 号标准文件,又叫 ECMA-262。 ECMAScript 定义

    2023年04月22日
    浏览(47)
  • 深入理解 ECMAScript modules:提升你的 JavaScript 技能(六)

    🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_ CSDN 博客专家、23年度博客之星前端领域TOP1 🕠 牛客 高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课 签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你

    2024年02月21日
    浏览(52)
  • 深入理解 ECMAScript modules:提升你的 JavaScript 技能(一)

    🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_ CSDN 博客专家、23年度博客之星前端领域TOP1 🕠 牛客 高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课 签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你

    2024年02月20日
    浏览(44)
  • 【前端】ECMAScript6从入门到进阶

    1.ES6简介及环境搭建 1.1.ECMAScript 6简介 (1)ECMAScript 6是什么 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。 (2)ECMAScript 和 JavaScript 的关系 E

    2024年02月07日
    浏览(43)
  • 前端框架前置课Node.js学习(1) fs,path,模块化,CommonJS标准,ECMAScript标准,包

    目录 什么是Node.js 定义 作用: 什么是前端工程化 Node.js为何能执行Js fs模块-读写文件 模块 语法: 1.加载fs模块对象 2.写入文件内容 3.读取文件内容 Path模块-路径处理 为什么要使用path模块 语法 URL中的端口号 http模块-创建Web服务 需求 步骤: 案例:浏览时钟 步骤: 什么是模块化 定

    2024年01月16日
    浏览(110)
  • ECMAScript6详解

    ECMAScript 6,也被称为 ES6 或 ECMAScript 2015,是 JavaScript 编程语言标准的一个主要更新。它于 2015 年正式发布,并带来了许多新特性和改进,使得 JavaScript 开发更加现代化和高效。下面是 ES6 的一些关键特性的详解: let 和 const : ES6 引入了 let 和 const 用于变量声明,提供了

    2024年01月16日
    浏览(54)
  • ECMAScript 6 之二

    目录 2.6 Symbol 2.7 Map 和 Set 2.8 迭代器和生成器 2.9 Promise对象 2.10 Proxy对象 2.11 async的用法 2.22 类class 2.23 模块化实现         原始数据类型,它表示是独一无二的值。它属于 JavaScript 语言的原生数据类型之一,其他数据类型是: undefined 、 null 、布尔值(Boolean)、字符串(Str

    2024年02月16日
    浏览(38)
  • ECMAScript 6

    ES6 全称ECMAScript 6 也叫ECMAScript2015 ES6的主要技术 1、变量、常量 2、取值赋值、解构 3、运算符的扩展、展开运算符、指数运算符 4、字符串的扩展 5、数组的扩展 6、函数的扩展 7、Set单值集合 8、Map键值对集合 9、对象的扩展 10、生成器和迭代器与迭代器接口 11、反射Reflect 12、

    2024年01月16日
    浏览(48)
  • ECMAScript 6 之Promise

    查看更多文章: https://alili.tech Promise与上一章的Generator一样,也是异步编程的一种解决方案. 在 jQuery,Angular都能找到相似的处理异步的方法. 这就是一个完整的Promise的使用方法.是不是非常的简单?

    2024年02月08日
    浏览(49)
  • ECMAScript 6之Map

    此文内容大多数出自阮一峰的ECMAScript 6 入门,大家可阅读原文。 Map 是 JavaScript 中的一种数据结构,它可以用于存储键值对,并且键可以是任意类型的值。与普通对象相比, Map 提供了更多的灵活性和扩展性。 以下是 Map 的一些特点和用法: 键可以是任意类型: Map  中的键可

    2024年01月23日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包