对象、原型与继承

73 阅读1分钟

传值传地址的区别

值类型

  function show(a) {
    console.log(a); // 1
  }
  let a = 1;
  show(a);
  function show(a) {
    a = 100;
    console.log(a); // 100
  }
  let a = 1;
  show(a);
  console.log(a); // 1 外面的a不会受影响

引用类型

  let user = { name: 'vvvvv' }
  function show(user) {
    user.name = 'xixi';
    console.log(user); // {name: 'xixi'}
  }
  show(user);
  console.log(user); // {name: 'xixi'}

展开语法实现函数参数合并

  function upload(params) {
    let config = {
      type: "*.jpeg,*.png",
      size: 10000,
    };
    params = { ...config, ...params };
    console.log(params); // {type: '*.jpeg,*.png', size: 999}
  }
  upload({ size: 999 });

属性检测

hasOwnProperty只检查自己,in自己和父亲都看

let obj = { name: '后盾人'};
console.log(obj.hasOwnProperty('name')); //true
let arr = ["后盾人"];
console.log(arr.hasOwnProperty("length")); //true
console.log(arr.hasOwnProperty("concat")); //false concat是原型上的数组方法
console.log("concat" in arr); //true
let arr = ["后盾人"];
console.log(arr);
console.log(arr.hasOwnProperty("length")); //true
console.log(arr.hasOwnProperty("concat")); //false
console.log("concat" in arr); //true

使用in原型对象上检测

let obj = {name: "后盾人"};
let hd = {
  web: "houdunren.com"
};

//设置hd为obj的新原型
Object.setPrototypeOf(obj, hd);
console.log(obj);

console.log("web" in obj); //true
console.log(obj.hasOwnProperty("web")); //false

补充:Object.setPrototypeOf() 方法设置一个指定的对象的原型 ( 即, 内部[[Prototype]]属性)到另一个对象或 null。

对象的计算属性

对象属性可以通过表达式计算定义,这在动态设置属性或执行属性方法时很好用 eg: 数组转对象

  const lessons = [
    {
      title: "媒体查询响应式布局",
      category: "css",
    },
    {
      title: "FLEX 弹性盒模型",
      category: "css",
    },
    {
      title: "MYSQL多表查询随意操作",
      category: "mysql",
    },
  ];
  let lessonObj = lessons.reduce((obj, cur, index) => {
    obj[`${cur["category"]}-${index}`] = cur;
    return obj;
  }, {})
  console.log(lessonObj);
  console.log(JSON.stringify(lessonObj,null,2));

image.png

没有原型的对象也是存在的

let vv1 = {}
console.log(vv1);

let vv = Object.create(null, {
  name: {
    value: 'xixi'
  }
})
console.log(vv);

image.png

Object.create(proto,[propertiesObject])

@proto: 新创建对象的原型对象
@propertiesObject: 可选,传入一个对象
@return 一个新对象,带着指定的原型对象和属性
// 创建一个原型为null的空对象
let o = Object.create(null);

原型方法与对象方法优先级