this
总结
1. 作为构造函数时,this指向实例化对象
2. 直接调用
非严格模式下this指向globalThis 、严格模式下this指向undefined
3. 哪个引用值调用它,this就指向该引用值
4. 可以通过 apply | call | bind 来修改调用函数时的this指向
案例
var name = '222'
var a = {
name: '111',
say: function() {
console.log(this.name)
}
}
var fun = a.say
fun()
a.say()
var b = {
name: '333',
say: function(fun) {
fun()
}
}
b.say(a.say)
b.say = a.say
b.say()
var foo = 123
function print() {
this.foo = 234
console.log(foo)
}
new print()
var a = 5
function go() {
var a
function test() {
a = 0
console.log(a)
console.log(this.a)
var a
console.log(a)
}
test()
console.log(a)
}
new go()
克隆
浅克隆
function shallowClone(Target,Origin) {
var toStr = Object.prototype.toString
Target = (typeof(Target) === 'object') ? Target : (toStr.call(Origin) === '[object Object]' ? {} : [])
for (var prop in Origin) {
Target[prop] = Origin[prop]
}
return Target
}
var arr1 = [1,2,3,{name:"arr1",ok:{age:18}}]
var arr2 = []
shallowClone(arr2,arr1)
arr2[0] = '1'
arr2[3].name = 'arr2'
arr2[3].ok = 'ok'
console.log('shalloClone:',arr1,arr2)
深克隆
function deepClone(Target,Origin) {
var toStr = Object.prototype.toString
Target = (typeof(Target) === 'object') ? Target : (toStr.call(Origin) === '[object Object]' ? {} : [])
for (var prop in Origin) {
var ele = Origin[prop]
if (ele && typeof(ele) === 'object') {
if (toStr.call(ele) === '[object Object]') {
Target[prop] = {}
} else {
Target[prop] = []
}
deepClone(Target[prop],ele)
} else {
Target[prop] = ele
}
}
return Target
}
var arr1 = [1,2,3,{name:"arr1",ok:{age:18}}]
var arr2 = []
deepClone(arr2,arr1)
arr2[0] = '1'
arr2[3].name = 'arr2'
arr2[3].ok = 'ok'
console.log('deepClone:',arr1,arr2)