2022.7.26 构造函数,面试:new的作用、深拷贝和浅拷贝

一、构造函数的写法

1.固定参数(不建议使用)

  function Car(name, color, suv) {
    this.name = name;
    this.color = color;
    this.suv = suv;
  }
  var benchi = new Car("benchi", "red", true);
  console.log(benchi);

 使用这个方法时需要注意:

  • 明确知道对象属性

  • 位置要严格对应

2. 对象类型参数

    function Car(obj) {
      this.name = obj.name;
      this.size = obj.size;
      this.color = obj.color;
      this.suv = obj.suv;
    }
    var audi = new Car({ size: "big", name: "audi", suv: true, color: "red" });
    console.log(audi);

即使传参顺序不同也不影响并且有维护方便,使用方便的特点,推荐使用。

二、new 的作用(面试)

1.如果不用 new 直接调用构造函数,会提示undefined

function Student(obj) {
  this.name = obj.name;
  this.score = obj.score;
  this.grade = obj.grade;
}
var stu1 = Student({
  name: 'Jack',
  score: 88,
  grade: 3,
});
console.log(stu1);

        由此可以确定,new 的第一个作用是把对象返回了回来(类似于函数没有 return 会提示 undefined )。

2.如果在没有 new 的情况下打印 this ,发现 this 指向 window 。

function Student(obj) {
  this.name = obj.name;
  this.score = obj.score;
  this.grade = obj.grade;
  console.log(this);
}
var stu1 = Student({
  name: 'Jack',
  score: 88,
  grade: 3,
});

        由此可见 new 的第二个作用,把构造函数的this指向了要返回的对象。

3.总结new作用:

  • 创建了新空对象
  • 将构造函数的作用域赋值给新对象(this指向新对象)
  • 执行构造函数代码 (为这个新对象添加属性)
  • 返回新对象

 三、深拷贝与浅拷贝(面试)

1.浅拷贝

        定义:对于引用类型而言,指两个引用类型指向同一个地址,改变一个,另一个也会随之改变。

    var person1 = { age: 20 };
    var person2 = person1;
    person1.age = 25;
    console.log("person1:", person1, "person2:", person2);

 2.深拷贝

        定义:对于引用类型而言,复制后引用类型指向一个新的内存地址,两个对象改变互不影响。

    var p1 = { age: 18 };
    //JSON.stringify序列化 JSON.parse反序列化
    var p2 = JSON.parse(JSON.stringify(p1));
    p1.age = 20;
    console.log(p2);

         注意:基础类型数据的赋值与深拷贝类似,但并不是深拷贝。

    var a = 1;
    var b = a;
    a = 10;
    console.log(a, b); // 10 1

        注意:数组的concat、slice是一层对象的深拷贝,如果对象的子属性是引用类型的话,就是浅拷贝。

    var a = [1, 2, 3];
    var b = [4, 5];
    var ab = a.concat(b);
    a = [2, 3];

    console.log(ab); // [1,2,3,4,5]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值