第四章 扩展的对象功能
对象类别
普通对象 奇异对象 标准对象 内置对象
对象字面量语法的扩展
属性初始化器的速记法
当字面量只有名称时,js 引擎会寻找最近作用域的同名变量,并将变量的值赋给同名属性。
function a(width, height) {
return {
width,
height,
}
}
方法简写
省略冒号与 function
关键字 ,sayHi()
属性被一个匿名函数所赋值。
var person = {
sayHi() {
alert('hi~') // sayHi: function(){}
},
}
可计算属性名
属性名可以传入变量或者常量,不只是一个固定的字符串。
const name = 'age'
const person = {
[`${name}`]: 20,
}
console.log(person.age) // 20
新的方法
Object.is()大部分情况与’===‘结果相同。
console.log(Object.is(+0, -0)); // false
console.log(Object.is(NaN, NaN)); // true
console.log(Object.is(5, "5")); // false
Object.assign() 在不继承的情况下,将 b 对象的属性(包括原型属性)复制到 a 对象,可接受任意数量的源对象,但同名属性会被覆盖。
切记 Object.assign()
不能将源对象的访问器属性复制到接收对象中。
var a = {},
b = { age: 29 }
Object.assign(a, b)
console.log(a.age) //29
重复的对象字面量属性
字面量属性(名)重复,则后者覆盖前者。
?自有属性的枚举顺序
- 数字类型键,按(属性名)升序排列。(为什么 k 在 a 前面)
- 字符串类型键,按添加顺序排列。(为什么在数字类型前)
- 符号类型键,按添加顺序排列。
var obj = {
F: 'eryue',
d: 'eryue',
k: 20,
a: 0,
2: 99,
}
console.log(Object.getOwnPropertyNames(obj)) // 2akFd
// ["2", "F", "d", "k", "a"] ???
更强大的原型
修改原型对象
对象实例化后,修改对象的原型,将 friend 的原型改为 person。
let friend = Object.create(dog);
Object.setPrototypeOf(friend, person);
super 引用的简单原型访问
super 是指向当前对象原型的一个指针 Object.getPrototypeOf(this)
,只能在方法简写内使用。
let friend = {
getGreeting() {
// Object.getPrototypeOf(this).getGreeting.call(this)
return super.getGreeting() + ", hi!";
}
};
(引用父类方方法?)
正式的“方法”定义
方法定义:拥有[[HomeObject]]
内部属性的函数,该属性指向方法所属对象。
let person = { //方法
getGreeting() {
return "Hello";
}
};
function shareGreeting() { //函数
return "Hi!";
}
super 会使用[[HomeObject]]
属性,先使用``Object.getPrototypeOf() 获取原型的引用,然后在该原型上寻找同名函数,最后创建
this`绑定并调用该方法。