扩展的对象功能

Wednesday, August 21, 2019

第四章 扩展的对象功能

对象类别

普通对象 奇异对象 标准对象 内置对象

对象字面量语法的扩展

属性初始化器的速记法

当字面量只有名称时,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

重复的对象字面量属性

字面量属性(名)重复,则后者覆盖前者。

?自有属性的枚举顺序

  1. 数字类型键,按(属性名)升序排列。(为什么 k 在 a 前面)
  2. 字符串类型键,按添加顺序排列。(为什么在数字类型前)
  3. 符号类型键,按添加顺序排列。
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`绑定并调用该方法。