工厂模式
构造函数
- 就是普通函数,只不过首字母要大写,内部写this,环境指向被实例化的对象
- 实例化:把某个变量,通过new构造函数变成了一个对象
- 数组,字符串等都是构造函数
原型模式
- js中所有数据类型都是对象
- new后面跟的不是类,是构造函数,(new的缺点)无法共享属性和方法
- prototype 属性的引入
共享的放到prototype 中,不共享的放到构造函数中
函数拥有prototype 属性 - 写法
函数和对象的关系
- new一个函数,就会实例化一个对象
- 函数
拥有prototype - 对象
拥有_proto_
new做了什么
- 创建一个对象
- 原型赋值(指向一个共同的原型对象)
- 改变this指向,原来是window,现在是指向对象
封装一个对象深拷贝
浅拷贝
只复制一层对象,当对象的属性是引用类型时,实际上复制的其引用,当引用指向的值发生变化时,原对象的属性值也会跟着变化,互相影响
或者是
assign合并
深拷贝
在拷贝的时候创建新的对象,并把原对象所有的属性都深拷贝到新对象,原属性如果是对象,也会创建新的对象并拷贝到新对象属性中,这样旧对象和新对象就是互相独立的,互不影响。
- JOSN.parse() + JOSN.stringify()
- 递归
<script>
var obj = {
a: 1,
b: {
a: "你好",
},
};
function fun(obj) {
var m = {};
if (typeof obj == "object") {
for (var k in obj) {
if (obj.hasOwnProperty(k)) {
if (typeof obj[k] == "object") {
m[k] = fun(obj[k]);
} else {
m[k] = obj[k];
}
}
}
}
return m;
}
var obj1 = fun(obj);
console.log(obj1.b.a);
console.log(obj.b.a);
</script>
原型链:每一个对象都有原型,还有属于自己的原型,最终形成原型链
原型的目的:继承,让对象的属性和方法实现共享
- 函数 prototype
- 对象 proto
- 如果压迫查找对象的属性或者方法,要去对象中查找
=>去对象的原型中查找==>去当前对象的原型的原型中查找=>......找不到返回 undifined
从最外层往原型链最深处找
继承
被new的是父亲,相当于父元素指向了child中的原型对象