在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 ] ]
4. 禁止对象扩展 [ [ PreventExtensions ] ]
// js实现: preventExtensions
let obj = { a: 1 }
Object.preventExtensions(obj 不可新增属性,不可删除,可读)
// obj 变的不可新增属性,可删除属性,可读,可改
5. 获取对象的可扩展性 [ [ IsExtensible ] ]
let obj = {}
let extensible = Object.isExtensible(obj)
1. freeze
2. seal
3. preventExtensions
6. 拦截对象操作 [ [ DefineOwnProperty ] ]
let obj = { a: 1 }
Object.defineProperty(obj, 'a', {
value: 1,
writable: true,
configurable: true,
enumerable: true,
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 ] ]
9. [ [ SET ] ]
// js实现: obj.a = 1, obj['a'] = 1 这种写法都是SET的实现
10. [ [ Delete ] ]
11. [ [ Enumerate ] ]
12. [ [ OwnPropertyKeys ] ]
// js实现: keys
var obj = { a: 1, b: 2 }
Object.setPrototypeOf(obj, { c: 3 })
Object.keys(obj) // ['a', 'b']
13. 函数调用
function fn() {} fn()
var obj = {
fn = function() {}
}
obj.fn()
14. 实例化对象