一、声明对象的两种语法
一种是通过字面量的形式,另外一种是通过new Object()的形式
例如创建一个person对象 它有 name,age,sex等属性。
- 字面量形式(literal syntax)
var person = {name:"flechazo",age:18,gender:"male"};
- new Object()形式
var person = new Object();
person.name="flechazo";
person.age=18;
person.gender="male";
注意:在JS中声明对象,大多会这么写var a = {};很少会这么写:var a = new Object();
为什么?
{}叫做对象字面量,new Object()则是使用构造器函数。对象字面量的声明方式比构造器函数更加方便。所以在JS中建议以对象字面量的声明方式优先。
在JavaScript中,使用new关键字后,意味着做了如下四件事情:
-
创建一个新的对象,这个对象的类型是object;
-
设置这个新的对象的内部、可访问性和[prototype]属性为构造函数(指prototype.construtor所指向的构造函数)中设置的;
-
执行构造函数,当this关键字被提及的时候,使用新创建的对象的属性;
-
返回新创建的对象(除非构造方法中返回的是'无原型')。
二、如何删除对象的属性
- delete obj.xxx
- delete obj['xxx']
三、如何查看对象的属性
-
查看自身属性: Object.keys(person); //键
-
查看自身和共有属性: console.dir(person);
-
查看属性名及属性值: Object.entries(person); //键值对
四、如何修改或增加对象的属性
- 直接赋值:
let person = {name:'flechazo'};
person.name = 'flechazo';
person['name'] = 'flechazo';
let key = 'name';
person[key] = 'flechazo';
- 批量赋值:
Object.assign(person,{gender:'female',age:18});
- 无法通过自身修改或增加共有属性,若偏要修改或增加原型上的属性
person.__proto__.toString = 'xxx'; //不推荐使用__proto__
window.Object.prototype.toString = 'xxx';
一般来说不要修改原型,会引起很多问题
- 修改隐藏属性:不推荐__proto__,推荐使用Object.create
例:
const p = {'name':'aaa','age': 18,'gender': 'male'};
let person = Object.create(p);
person.name = 'flechazo';
let person2 = Object.create(p);
person2.name = 'flechazo2';
五、'name' in obj和obj.hasOwnProperty('name') 的区别
- 'name' in obj无论自身属性还是原型链属性都会检测。
- hasOwnProperty()方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性。 //不检测原型链
console.log('toString' in person); //true
console.log(person.hasOwnProperty('toString')); //false