如何实现call?
Function.prototype.myCall = function (context, ...args) {
const s = Symbol()
context[s] = this // 该this指向的是调用的函数`func.myCall(...)`,此时func会当作对象来用
const res = context[s](...args) // 此时该函数内的this指向的就是context了
delete context[s]
return res
}
add.call(obj, 1,2)
如何修改一个闭包里的数据?
Object上有一个valueOf属性,该属性为一个函数,执行可以返回对象自身,但是会有this指向问题,因此不行。 因此需要自己写一个类似的
Object.defineProperty(Object.prototype, 'myValueOf', {
get: function() {
return this // value, get(), set()
}
})
o.get('myValueOf').a = 100 // 这样就能修改闭包内数据
如何避免这种修改,可以在读取obj的属性的时候加一个判断
get: function(k) {
if (obj.hasOwnProperty(k)) {
return obj[k]
}
return undefined
}
如何实现assign?
assign(target, source) // 将source的内容浅拷贝到target
function assign(target, source) {
Object.getOwnPropertyNames(source).forEach(key => {
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
})
}
如何实现一个深拷贝?
// 一个简单的深拷贝
function clone(target) {
if (typeof target === 'object') {
let cloneTarget = Array.isArray(target) ? [] : {}; // 考虑数组
for (const key in target) {
cloneTarget[key] = clone(target[key]);
}
return cloneTarget;
} else {
return target;
}
};