FE-DSHUI / DSHUI

前端王者小分队读书会
4 stars 1 forks source link

《重学ES6:反射Reflect》——2021-02-28 #55

Open isbaselvy opened 3 years ago

isbaselvy commented 3 years ago

/**

/** API-Reflect.apply(),和 Function.prototype.apply() 功能类似。

/**

/**

/**

/**

/**

/**

/**

/**

/**
    * Reflect.own​ Keys()
    Reflect.ownKeys 方法返回一个由目标对象自身的属性键组成的数组。 
    它的返回值等同于 Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))
    语法
    Reflect.ownKeys(target)
    解释 *
        参数 含义 必选
    target 获取原型的目标对象 Y
    */

{ console.log('Reflect.ownKeys:', Reflect.ownKeys({ z: 3, y: 2, x: 1 })) // [ "z", "y", "x" ]

// 数组
console.log(Reflect.ownKeys([])) // ["length"]

// symbol
var sym = Symbol.for("comet");
var sym2 = Symbol.for("meteor");
var obj = {
    [sym]: 0,
    "str": 0,
    "0": 0,
    [sym2]: 0
};
console.log(Reflect.ownKeys(obj)) // ["0", "str", Symbol(comet), Symbol(meteor)]
// Indexes in numeric order,
// strings in insertion order,
// symbols in insertion order

}


/**
 * Reflect.prevent​Extensions() 
    Reflect.preventExtensions 方法阻止新属性添加到对象 例如: 防止将来对对象的扩展被添加到对象中)。 
    该方法与 Object.preventExtensions() 方法一致
    语法
    Reflect.preventExtensions(target)
    解释 *
        参数 含义 必选
    target 获取原型的目标对象 Y
 */

{ // Objects are extensible by default. var empty = {}; console.log('Reflect.isExtensible:', Reflect.isExtensible(empty)) // === true // ...but that can be changed. Reflect.preventExtensions(empty); console.log('Reflect.isExtensible after preventExtensible:', Reflect.isExtensible(empty)) // === true // Reflect.preventExtensions(1); // Uncaught TypeError: Reflect.preventExtensions called on non-object console.log('Object.preventExtensions:', Object.preventExtensions(1)) }


/**
 * Reflect.set()
    Reflect.set 方法允许你在对象上设置属性。 它的作用是给属性赋值并且就像 property accessor 语法一样, 但是它是以函数的方式。
    语法
    Reflect.set(target, propertyKey, value[, receiver])
    解释 *
        参数 含义 必选
    target 获取原型的目标对象 Y
    propertyKey 设置的属性的名称 Y
    value 设置的值 Y
    receiver 如果遇到 setter, this 将提供给目标调用 N
 */

{ var obj = {}; Reflect.set(obj, "prop", "我是Reflect.set的prop"); // true console.log('Reflect.set:', obj.prop); // "value" // Array var arr = ["duck", "duck", "duck"]; Reflect.set(arr, 2, "goose"); // true console.log('Reflect.set arr:', arr); // ["duck", "duck", "goose"] // It can truncate an array. Reflect.set(arr, "length", 1); // true console.log('Reflect.set arr length:', arr) // ["duck"] // 只有一个参数,key和value都是undefined var obj = {}; Reflect.set(obj); // true console.log(obj) // 6_Reflect.js:293 {undefined: undefined} console.log( Reflect.getOwnPropertyDescriptor(obj, undefined)) // { value: undefined, writable: true, enumerable: true, configurable: true } }


/**
 * Reflect.set​PrototypeOf()
    Reflect.setPrototypeOf 方法改变指定对象的原型( 即, 内部的[[Prototype]] 属性值)
    语法
    Reflect.setPrototypeOf(target, prototype)
    解释 *

        参数 含义 必选
    target 获取原型的目标对象 Y
    prototype 对象的新原型( 一个对象或 null) Y

 */

{ let obj = {} Reflect.setPrototypeOf(obj, Object.prototype); // true console.log(Reflect.getPrototypeOf(obj))

// 改变prototype
Reflect.setPrototypeOf(obj, null);  // true
console.log(Reflect.getPrototypeOf(obj)) // null

// 
Reflect.setPrototypeOf(obj, String); // true
console.log(Reflect.getPrototypeOf(obj)) // String

// 如果obj是不可扩展的,则设置不成功
Object.freeze(obj)
console.log(Reflect.setPrototypeOf(obj, null))     // false
console.log(Reflect.getPrototypeOf(obj)) // String

// 如果设置导致原型链循环,则设置不成功
var target = {};
var proto = Object.create(target);
console.log(Reflect.setPrototypeOf(target, proto)) // false

}



/**
 * [!WARNING]
 * 对于以上所有 API 第一个参数是 Object 的, 如果给定的不是 Object 则抛出一个 TypeError 异常
 */