经过关键字new关键字建立的实例有如下的两个特色:javascript
模拟实现new的代码:java
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;
}
复制代码
1、赋值数组
2、浅拷贝 浅拷贝就是对于引用的引用类型的值拷贝的只是引用的地址,当引用的内容发生改变的时候,两个变量的内容都会受到影响。浅拷贝程序示例:app
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()
:能够将一个或者多个对象的全部可枚举的属性全都复制到另外一个对象。3、深拷贝ui
执行深拷贝的时候,会拷贝全部的属性,而不是只拷贝地址。深拷贝完成以后,两个值之间就不会相互影响了。spa
深拷贝的使用场景prototype
JSON.parse(JSON.stringift(object))
:用于对JSON对象和JSON字符串之间的转换,在这个过程当中是深拷贝,对象的每个可枚举的属性都会被复制。code
总结对象
和原数据是否指向同一对象 | 第一层数据为基本数据类型 | 原数据中包含子对象 | |
---|---|---|---|
赋值 | 是 | 改变会使原数据一同改变 | 改变会使原数据一同改变 |
浅拷贝 | 否 | 改变不会使原数据一同改变 | 改变会使原数据一同改变 |
深拷贝 | 否 | 改变不会使原数据一同改变 | 改变不会使原数据一同改变 |