美文网首页
ES6新特性-class、深浅拷贝

ES6新特性-class、深浅拷贝

作者: 橙赎 | 来源:发表于2020-04-01 17:49 被阅读0次

一、ES6新语法-class

JavaScript 语言的传统方法是通过构造函数定义并生成新对象。ES6中引入了class的概念,通过class关键字自定义类。实质上是构造函数的语法糖,封装后有了一个更清晰的写法,而且更加像一个面向对象编程语言。

  • ES5用法
        function Person(name, age) {
            this.name = name;
            this.age = age;
            this.sayName = function () {
                console.log(this.name)
            }
        }
        Person.prototype.getName = function () {
            console.log(this.name)
        }

        let p1 = new Person('小明', 12);
        console.log(p1.name, p1.age);
        p1.getName();
  • ES6新语法-classextends
 class Person {
            constructor(name, age) {
                this.name = name;
                this.age = age
            }
            // 原型对象
            getName() {
                return this.name
            }
            sayName = () => {
                console.log(this.name)
            }
        }
                //子类Student继承父类Person
        class Student extends Person {
            constructor(name, age) {
                super(name, age) //调用父类的属性和方法
            }
        }
                let s1 = new Student('小花', 23)
        console.log(s1.name, s1.age)
        s1.sayName();

二、浅拷贝和深拷贝

  • 浅拷贝:将一个对象的属性和方法复制到另一个对象上, 只复制一层,如果属性是对象,只复制对象的地址。
    • 例子
 // 旧对象
        const oldObj = {
            name: '小明',
            age: 12,
            sex: '男',
            action: {
                run: '跑步',
                watchTv: '看电视'
            }
        }
        // 新对象
        const newObj = {}
        // 将旧对象拷贝到新对象里
        const copy = (oldObj, newObj) => {
            for (const key in oldObj) {
                newObj[key] = oldObj[key]
            }
        }
        copy(oldObj, newObj);
        console.dir(oldObj);
        console.dir(newObj)
//=======================================================
打印结构的内容
Object
    name: "小明"
    age: 12
    sex: "男"
    action: {run: "跑步", watchTv: "看电视"}
    __proto__: Object

Object
    name: "小明"
    age: 12
    sex: "男"
    action: {run: "跑步", watchTv: "看电视"}
    __proto__: Object
//=======================================================//

当我们去改变旧对象的属性时:

   oldObj.action.run = '走路'
//=======================================================
打印结构的内容
Object
    name: "小明"
    age: 14
    sex: "男"
    action: {run: "走路", watchTv: "看电视"}
    __proto__: Object

Object
    name: "小明"
    age: 14
    sex: "男"
    action: {run: "走路", watchTv: "看电视"}
    __proto__: Object
//=======================================================//

可以看到当改变旧对象的属性对象时,新对象的属性对象也会改变。这就是浅拷贝的弊端

  • 深拷贝:会克隆出一个对象,数据相同,但是引用地址不同。就是拷贝出来的完完全全就是一个新的对象,不受原对象的影响
         //旧对象
        const oldObj = {
            name: '小明',
            age: 18,
            sex: '男',
            fun: {
                swiming: '游泳',
                lookbook:'看书',
            }
        }

        //新对象
        const newObj = {}

        //拷贝函数
        const copyObj = (oldObj, newObj) => {
            for (key in oldObj) {
                let item = oldObj[key];
                if(item instanceof Object){
                    newObj[key] = {}; //创建一个新空间
                    copyObj(item,newObj[key]);
                }else{
                    newObj[key] = oldObj[key]
                }
            }
        }
        copyObj(oldObj, newObj);
                //分别改变旧对象和新对象的属性
        oldObj.sex = '女';
        oldObj.fun.swiming = '象棋'
        newObj.fun.lookbook = '读书'

        console.dir(oldObj);
        console.dir(newObj);
//=======================================================
打印结构的内容
Object
    name: "小明"
    age: 18
    sex: "女"
    fun: {swiming: "象棋", lookbook: "看书"}
    __proto__: Object
  
Object
    name: "小明"
    age: 18
    sex: "男"
    fun: {swiming: "游泳", lookbook: "读书"}
    __proto__: Object
//=======================================================//

从上述代码可以看到分别改变旧对象的属性对象后对新对象没有影响

图解: 深拷贝

相关文章

  • ES6新特性-class、深浅拷贝

    一、ES6新语法-class JavaScript 语言的传统方法是通过构造函数定义并生成新对象。ES6中引入了c...

  • ES6新特性

    ES6新特性 1.类(支持继承 extends)class TestClass { constructor(...

  • ES6改良ES5中的5大“缺陷”

    前言 ECMAScript 6 (ES6) 新特性可以分为: 新增语法(例如:class) 增强 JavaScri...

  • ES6在企业中的应用

    模板字符串 解构赋值解构赋值最常用的在于函数。 数组spread es6浅拷贝 函数新特性之箭头函数 函数新特性之...

  • ES6 新特性:Class

    定义一个 class 每一个使用 class 方式定义的类默认都有一个构造函数 constructor() 函数,...

  • ES6基础

    ES6特性 ES6更具备强大的生产力 ES6对象拷贝

  • js 手写深浅拷贝

    实现深浅拷贝 浅拷贝 先说一下浅拷贝的实现方式 Object.assign() ES6 中 Object 的一方法...

  • 用Decorator优化React

    什么是decorator decorator是ES6的一个新特性,可以修改class的属性 通过decorator...

  • 前端面试经典

    javaScript 理解MVVM等框架,手写伪代码。 ES6新特性,说说class 从编译角度谈谈变量提升 对象...

  • JS语法 ES6、ES7、ES8、ES9、ES10、ES11、E

    新特性 ES6(2015) 1. 类(class) 2. 模块化(ES Module) 3. 箭头(Arrow)函...

网友评论

      本文标题:ES6新特性-class、深浅拷贝

      本文链接:https://www.haomeiwen.com/subject/lfwauhtx.html