深度解析new原理以及模拟实现
通过关键字new关键字创建的实例有以下的两个特点:
- 1、实例可以访问到构造函数里面的属性
- 2、实例可以访问到原型里面的属性
模拟实现new的代码:
function create(){
//创建一个空对象
var obj = new Object();
//获得构造函数,arguments去除第一个参数
var Con = [].shift.call(arguments);
//链接到原型,obj可以访问到构造函数原型的属性
obj.__proto__ = Con.prototype;
var ret = Con.apply(obj, arguments);
//优先返回构造函数返回的对象
return ret instanceof Object ? ret : obj;
}
详细解释赋值,浅拷贝和深拷贝的区别
一、赋值
- 基本类型赋值:赋的是值,赋值前后两个变量互相之间不影响。
- 引用类型赋值:赋的是引用的地址,引用赋值之后这两个变量有相同的引用,指向同一个对象,相互之间会有影响。
二、浅拷贝 浅拷贝就是对于引用的引用类型的值拷贝的只是引用的地址,当引用的内容发生改变的时候,两个变量的内容都会受到影响。浅拷贝程序示例:
var a = {
name: "zhangsan"
};
var b = a;
console.log("修改之前:");
console.log(a); //zhangsan
console.log(b); //zhangsan
a.name = "lisi";
console.log("修改之后:");
console.log(a); //lisi
console.log(b); //lisi
浅拷贝的使用场景
Object.assign():可以将一个或者多个对象的所有可枚举的属性全都复制到另一个对象。- 展开语法{...}
- Array.prototype.slice():该方法返回的是一个新的数组对象,这个方法执行的是原数组的浅拷贝,原始数组是不会被改变的。
三、深拷贝
执行深拷贝的时候,会拷贝所有的属性,而不是只拷贝地址。深拷贝完成之后,两个值之间就不会相互影响了。
深拷贝的使用场景
JSON.parse(JSON.stringift(object)):用于对JSON对象和JSON字符串之间的转换,在这个过程中是深拷贝,对象的每一个可枚举的属性都会被复制。
总结
| 和原数据是否指向同一对象 | 第一层数据为基本数据类型 | 原数据中包含子对象 | |
|---|---|---|---|
| 赋值 | 是 | 改变会使原数据一同改变 | 改变会使原数据一同改变 |
| 浅拷贝 | 否 | 改变不会使原数据一同改变 | 改变会使原数据一同改变 |
| 深拷贝 | 否 | 改变不会使原数据一同改变 | 改变不会使原数据一同改变 |