文章目录
1.属性的简洁表示法
(1)属性和方法
/*允许在对象内部直接使用变量【即属性和属性值变量一致,可以简写】*/
let name='张三';
let stu={
name,
//等同于
//name:name
sleep(){},
//等同于
sleep:function(){}
}
简写方法不能当做构造函数来使用
(2)属性的的getter setter访问器
let person={
get name(){
console.log("获取name属性");
return this._name;
},
set name(n){
console.log("设置name属性");
this._name=n; //注意不要同名 否则会死循环
},
init(){}
}
console.log(person);
person.name="张三"; //设置name属性
console.log(person.name); //获取name属性 张三
//简写方法不能当做构造函数来使用
new person.init(); //person.init is not a constructor
2.属性名表达式
对象取值
方法一:对象.属性
方法二:对象[key] (不止可以取值 还能监测属性是否存在)
如果使用字面量方式定义对象(使用大括号),在 ES5 中只能使用方法一
var obj = {
foo: true,
abc: 123
};
ES6 允许字面量定义对象时,用方法二(表达式)作为对象的属性名,即把表达式放在方括号内
let key="name";
let obj={
[key]:'张三'
}
console.log(obj); //{name: '张三'}
console.log(obj[key]); //张三
console.log(obj['name']); //张三
3.方法的 name 属性
方法的name属性返回函数名(即方法名)
const person = {
sayName() {
console.log('hello!');
}
};
console.log(person.sayName.name); //sayName
getter setter访问器
不能直接获取getter setter访问器的函数名称(undefined)
//es6 get set 访问器写法
let obj={
get sex(){return this._sex;},
set sex(n){this._sex=n;}
}
console.log(obj.sex.name); //undefined)
可以使用getOwnPropertyDescriptor获取
//获取getter setter访问器 函数名称
let descr=Object.getOwnPropertyDescriptor(obj,'sex');
console.log(descr);
Object.getOwnPropertyDescriptor(object, propertyname) 方法返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)
obj:需要查找的目标对象
prop:目标对象内属性名称补充: es5使用原生js在对象上设置getter,setter访问器
//设置多个属性 Object.defineProperties(obj,{ name:{ get: function () { return this.firstName+this.lastName; }, set: function (n) { let firstName= n.split('-')[0]; let lastName= n.split('-')[1]; this.firstName=firstName; this.lastName=lastName; } } }); console.log(obj); obj.name="李-四"; console.log(obj.name); //设置单个属性 Object.defineProperty ```
4.属性的可枚举性和遍历
(1)可枚举 enumerable
描述对象的enumerable属性,称为“可枚举性”,如果该属性为false,就表示某些操作会忽略当前属性
遍历只对可枚举属性遍历
(2)遍历对象的属性
-
for…in
遍历对象自身的和继承的可枚举属性(不含 Symbol 属性) -
Object.keys(obj)
返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名 -
Object.getOwnPropertyNames(obj)
返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名
5.super 关键字
this关键字总是指向函数所在的当前对象,
ES6 又新增了另一个类似的关键字super,指向当前对象的原型对象
let person={
name(){
console.log("全名称");
}
}
let student={
sleep(){
console.log(this); //{sleep: ƒ sleep()}
super.name(); //全名称
}
}
//设置原型对象
Object.setPrototypeOf(student,person);
student.sleep();