对象

为对象添加原型

const obj = {
    x:1,
    y:2,
    add:function(a, b){
        return a + b
    }
}

使用prototype添加原型

const Empty = function(){}
Empty.prototype = obj
const empty = new Empty()
empty.add(1, 2)    // 3

使用Object.create()直接创建继承原型的对象的实例对象

const test = Object.create(obj, {    // 第二个参数不传默认为{}
    "a": {
        value: 10,
        writable:false
    },
    "b": {
        value: 100
    },
})

override重载时,不会修改原型本身

empty.x = 10
console.log(empty.x)    // 10
console.log(obj.x)        // 1

查看原型

Object.getPrototypeOf(empty)

检测属性

in和hasOwnProperty均可用来检测对象中属性是否存在

hasOwnProperty只能检测自有属性,无法查找原型链,in可以检测自有属性或继承属性
const o = {x:1}

o.hasOwnProperty("x")
"x" in o

getOwnPropertyDescriptor可查看当前属性描述,但只能查看自有属性

// 输出{ value: 1, writable: true, enumerable: true, configurable: true }
console.log(Object.getOwnPropertyDescriptor(o, "x"))

为对象添加属性

数据属性的四个特性分别是:值(value) 可写性(writable) 可枚举性(enumable) 可配置性(configurable)
Object.defineProperty(o, "y", {
    value: "test",           //
    enumerable:false,    // 是否可枚举
    writable:false,         // 可写性
    configurable:false    // 可配置性
})    

存取器

存取器属性的四个特性分别是:读取(get) 写入(set) 可枚举性(enumable) 可配置性(configurable)
const o = {
    x: "",
    get getX(){
        return this.x
    },
    set setX(val){
        this.x = val
    }
}

可以用闭包来实现私有属性,并定制get set

const Test = (function(){
    let x = "10"
    return function(){
        this.getX = function(){
            return x
        }
        this.setX = function(val){
            x = val
        }
    }
})()

 扩展对象

Object.assign(target, ...sources),将所有source对象中的可枚举属性分配到target对象
后面的source对象会覆盖前面的同名属性,也会覆盖target中的属性
let a = {a:0}
let b = {a:1}
let c = {a:2, b:3, c:4}
const obj = Object.assign(a, b, c)
console.log(obj) // { a: 2, b: 3, c: 4 }
若想避免原属性中的被覆盖,可以将其放在最后
const obj = Object.assign({}, b, c, a)
使用扩展操作符也可以做到相同操作(注:扩展操作符只能扩展自有属性,不能扩展继承属性,且本身为浅复制,引用类型扩展后仅扩展地址)
const obj = {...b, ...c, ...a}

 对象字面量扩展方法

简写属性

let x = 1, y = 2
let o = {x, y}  // o.x=1 o.y=2
可自动根据值来计算的属性名和方法名
const PROPERTY_NAME = "p1"
const computerPropertyName = function() { return "p" + 2}

let p = {
    [PROPERTY_NAME]: 1,
    [computerPropertyName()]() {return 2} 
}
console.log(p.p1) // 1
console.log(p.p2()) // 2
可以使用Symbol标识符作为属性名
因为Symbol具有唯一性,所以可以防止与原对象中一些属性命名冲突带来的问题
const extension = Symbol("my extension symbol")
let obj = {
    [extension]: { x: 0 },
    "my extension symbol": { x: 1 }
}
console.log(obj[extension].x)   // 0
console.log(obj["my extension symbol"].x)  // 1

 

posted @ 2021-11-27 23:36  邢韬  阅读(42)  评论(0编辑  收藏  举报