学习时间 |
完成时间 ✅ |
重难点 |
疑问/遗漏 |
|
|
|
|
复习时间 |
|
|
|
|
|
|
对象克隆、浅拷贝
var person1={
name:'张三',
age:18,
father: {
first: 'anmi'
}
}
var person2=person1;
person2.name='李四'
此时person1的数据也被改变了
var person2={};
浅拷贝,因为当对象里还有对象,则就改变person2仍然会改变person1
for(var key in person1){
if(person1.hasOwnProperty(key)){
person2[key]=person1[key]
}
}
person2.father.second='cc'
此时再改变person2就不会再改变person1了,但是改变person2.father的内容person1也会跟着改变
深拷贝
方法一
function deepClone(origin,target){
var target=target||{},
toStr=Object.prototype.toString;
arrType='[object Array]';
for(var key in origin){
if(origin.hasOwnProperty(key)){
if(typeof(origin[key])==='object'&&origin[key]!==null){
if(toStr.call(origin[key])===arrType){
target[key]=[];
}else{
target[key]={}
}
deepClone(origin[key],target[key])
}else{
target[key]=origin[key]
}
}
}
return target;
}
方法二
JSON.stringify()
JSON.parse()
习题
var name='222';
var a={
name:'111',
say:function(){
console.log(this.name)
}
}
var fun =a.say;
fun(); //'222'
a.say(); //'111'
var b={
name:'333',
say: function(fun){
fun();
}
}
b.say(a.say);//'222'
b.say=a.say;
b.say()//'333'
function test(){
var marty={
name:'marty',
printName: function(){
console.log(this.name)
}
}
var test1={name:'test1'}
var test2={name:'test2'}
var test3={name:'test3'}
test3.printName=marty.printName;
marty.printName.call(test1);//test1
marty.printName.apply(test2);//test2
marty.printName();//marty
test3.printName();//test3
}
var bar={a:'1'}
function test(){
bar.a='a';
Object.prototype.b='b'
return function inner(){
console.log(bar.a) //a
console.log(bar.b) //b
}
}
test()();
/**************************/
function Foo(){
getName=function(){
console.log(1);
}
return this;
}
Foo.getName=function(){ //此处的Foo并没有执行,只是相当于往对象Foo添加一个属性
console.log(2)
}
Foo.prototype.getName=function(){
console.log(3)
}
var getName=function(){
console.log(4)
}
function getName(){
console.log(5)
}
Foo.getName(); //2
getName(); //4
//预编译GO
//1.变量声明
//2.函数声明
//3.运行->赋值
Foo().getName(); //1
getName(); //1
new Foo.getName();//2 此处先执行Foo.getName() 为2 new 2还是2
new Foo().getName();//3 此处先执行new Foo()
new new Foo().getName();//3