每天至少一个手写方法,简略实现javascript的一些内置方法,有问题请指出~~~
文章目录
1.extend
2021-6-2
function _extends(...arg) {
const res = {};
for (let index = 0; index < arg.length; index++) {
const obj = arg[index];
for (const v in obj) {
// 这里的Object.hasOwnProperty.call下面讲解一下
if (Object.hasOwnProperty.call(obj, v)) {
const element = obj[v];
if (typeof element === "object") res[v] = _extends(element);
else
res[v] = element;
}
}
}
return res;
}
// 以下是测试参数
const place = { address: "2999弄" };
const father = { son: "3" };
const parent = { father, mother: "2" };
const param1 = { name: "a" };
const param2 = { age: 20, sex: "man" };
const param3 = { place: place, parent: parent };
let res = _extends(param1, param2, param3);
place.address = "abc"; // 检测是不是深拷贝
father.son = "999"; // 检测是不是深拷贝
console.log(place, res);
// 对象也可以深拷贝,时间:15分钟
补充:Object.hasOwnProperty.call
以上摘自https://www.cnblogs.com/weiqinl/p/8683207.html#!comments
总结:
- hasOwnProperty不是一个敏感词,可以被用户重写
- 如果是通过Object.create(null)出来的空对象是没有原型属性的,自然没有hasOwnProperty方法
- obj重写了hasOwnProperty方法,obj.hasOwnProperty(“key”)将永远返回false
const obj = {
hasOwnProperty:()=>{
return false;
}
}
- 同上,重写了obj.prototype的hasOwnProperty方法
所以Object.prototype.hasOwnProperty(obj,“key”)就是保证hasOwnProperty方法是Object原型链上的那个方法,而不是我们修改后的