Object.create(null)用来初始化一个新对象和{}区别

区别:

Object.create(null)不会继承Object原型上的任何东西 如没有继承方法toString()

{}创建的新对象会继承 所有Object的属性 可以在console上查看到

为什么用Object.create(null)

1  因为使用create创建的没有任何属性 可以自己定义hasOwnProperty,toString()方法等

2 for in 循环的时候不会再遍历原型链上的属性 ,使用create(null)就不会再对属性进行检查了,也可以使用Object.keys[]

什么时候用Object.create(null)

1 你需要一个非常干净且高度可定制的对象当做数据字典的时候,比如serverAPI里的一些变量

2 减少hasOwnProperty造成的性能损失

let server_address = "";
if (process.env.NODE_ENV == "production") {
  //生产环境服务器地址
  server_address = "";
} else {
  //开发环境服务器地址
  server_address = "";
}
// 服务器api地址
const api = {
  // 接口地址}
// 自动给接口地址添加域名
const autoAddServerAddress = function (obj: any) {
  const result = Object.create(null)
  for (let key in obj) {
    if (typeof obj[key] === 'object') {
      result[key] = autoAddServerAddress(obj[key])
    } else {
      result[key] = server_address + obj[key]
    }
  }
  return result
}

export default autoAddServerAddress(api)

1 接口访问地址是:协议 域名 端口 地址 

所以

但又有出于开发结构,经常要换,域名的情况 比如 开发用www.test.com

生产:www.product.com/login

如果,我在用这个接口的时候,直接写www.test.com/login,哪在部署生产的时候


我就要深入功能代码的内部,才能去更改


所以,我用了一个对象来存储接口地址

var a = { login"  }


var a ={login:'/login'}


只储存后面的目录部分


所以就需要动态的拼接域名部分


这样,以后切换域名


我只需要改一个地方,所有的接口都会更改


第一个是递归 return的


第二个是对象的某个属性的











你可能感兴趣的:(Object.create(null)用来初始化一个新对象和{}区别)