**
原型和原型链
**
1.–proto–:原型链对象,表示当前类型的父级元素任何类型都具有;
2.prototype:原型对象,只有函数才有,专门给将来别new出来的对象做父级的(箭头函数没有prototype,因为箭头函数不能被new出来);
3.对象访问属性和方法的原则——就近原则:先在自己的身上找,找到了就执行,找不到顺着——proto——向上依次寻找,找到了就停止执行 个,找不到一直向上。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
function fn(){
this.name='zhangsan'
}//构造函数
fn.prototype.show=function(){}
var p1=new fn();//实例化
var a={}//字面量
console.dir(fn);
console.log(p1);
console.log(a);
console.log(a.__proto__==p1.__proto__.__proto__);
console.log(fn.prototype==p1.__proto__)
</script>
</body>
</html>
解析:1.new出来的实例父对象就是构造函数的prototype,将方法和属性存入构造函数的prototype中也就是将属性和方法存入了实例的父对象中,然后new出来的实例利用(就近原则)找到相应的属性和方法。
**
深浅拷贝
**
一.堆和栈的概念
栈:储存变量名,不可修改,空间小,先进后出;
堆:储存数据,可以修改,空间大。先进先出;
二.数据的复制方式
1.基础数据(值传递):字符,数值,布尔,undefined
复制时,复制的是值,在栈堆关系中,栈和堆,一一对应
2.复杂数据(引用传递):对象(数组,函数)
复制时,复制的是内存地址,在栈堆关系中,栈和堆,可以多对一
引用传递数据类型的
深浅拷贝:
默认是浅拷贝:只拷贝地址,不拷贝值
深拷贝:拷贝值
对象的枚举:for-in,(递归)
三:实例
var a=10;
var b=a;
b=20;
console.log(a,b);//基础数据的复制方式
//复杂数据的复制方式:引用传递,复制的是内存地址
//这是对象的浅拷贝,
var obj1={
name:'zhangsan',
age:18,
sex:'男'
}
var obj2=obj1; //复杂类型的引用传递
obj2.name='陈军';
console.log(obj1,obj2);
//对象的深拷贝
var obj3={};
for(var i in obj1){
obj3[i]=obj1[i];//转化成了简单类型转化
}
obj3.name='张钦';
console.log(obj3,obj2)
四:对象深拷贝方法简介
1.对象的枚举for in(见实例)
2.利用json和对象的转化:JSON.parse和JSON.stringify 让对象的复制由对象转为字符的运算
var obj1={
name1:{
name2:{
name3:{
name4:'哈哈'
}
}
}
}
var str=JSON.stringify(obj1);
var obj2=JSON.parse(str);
obj2.name1.name2.name3.name4='呵呵';
console.log(obj1,obj2);