2

先贴一个MDN地址,搜的时候搜js实现的方法名

1. 获取对象原型 [ [ GetPrototypeOf ] ]

// js实现: GetPrototypeOf
let obj = {}
let proto = Object.getPrototypeOf(obj)
proto === obj.__proto__ === Object.prototype  // true

2. 设置对象原型 [ [ SetPrototypeOf ] ]

// js实现: SetPrototypeOf
let obj = {}
Object.setPrototypeOf(obj, { a: 1, b: 2 }) // 函数式
obj.__proto__ = { a: 1, b: 2 } // 赋值式
Object.prototype = { a: 1, b: 2 } // 赋值式
// 上面效果一样

3. 获取对象自有属性 [ [ GetOwnProperty ] ]

// js实现: 
// 1. getOwnPropertyDescriptor 获取对象下某一个属性的描述符
// 2. getOwnPropertyDescriptors 获取对象下所有属性的描述符
// 3. getOwnPropertyNames 获取对象下所有属性名(不包括Symbol)
// 4. getOwnPropertySymbols 获取对象下所有Symbol属性名

// 描述符为 configurable enumerable writable value

4. 禁止对象扩展 [ [ PreventExtensions ] ]

// js实现: preventExtensions
let obj = { a: 1 }
Object.preventExtensions(obj 不可新增属性,不可删除,可读)
// obj 变的不可新增属性,可删除属性,可读,可改

5. 获取对象的可扩展性 [ [ IsExtensible ] ]

// js实现: isExtensible
let obj = {}
let extensible = Object.isExtensible(obj) // true

// 使对象变的不可扩展的方法
1. freeze 
2. seal 
3. preventExtensions

6. 拦截对象操作 [ [ DefineOwnProperty ] ]

// js实现: defineProperty 单个属性, defineProperties 多个属性
let obj = { a: 1 }
Object.defineProperty(obj, 'a', {
    value: 1,
    writable: true,
    configurable: true,
    enumerable: true,
    // 前面是描述符
    // value, writable可同时出现,get, set也可同时出现
    // 但当 value 和 writable 出现任意一个时,不可以配置 get, set,反之亦然
    get() {}
    set() {}
})

7. 判断对象是否有某个自有属性 [ [ HasProperty ] ]

// js实现: hasOwnProperty
var obj = { a: 1 }
Object.setPrototypeOf(obj, { b: 2 })
obj.hasOwnProperty('a') // true
obj.hasOwnProperty('b') // false

8. [ [ GET ] ]

// js实现: 关键字 in, obj.a 这种写法中的 . 等,都是GET的实现

9. [ [ SET ] ]

// js实现: obj.a = 1, obj['a'] = 1 这种写法都是SET的实现

10. [ [ Delete ] ]

// js实现: 关键字 delete

11. [ [ Enumerate ] ]

// js实现: 关键字组合 for in

12. [ [ OwnPropertyKeys ] ]

// js实现: keys
var obj = { a: 1, b: 2 }
Object.setPrototypeOf(obj, { c: 3 })
Object.keys(obj) // ['a', 'b']

13. 函数调用

// js实现: 执行函数声明和执行函数表达式
function fn() {}    fn() // 执行函数声明
var obj = {
    fn = function() {}
}
obj.fn() // 执行函数表达式

14. 实例化对象

// js实现: new 关键字

海洋饼干
1.5k 声望191 粉丝