Object.js Object instanceof Function; // trueFunction instanceof Object; // true/*判断左边的原型链__proto__是否在右边的prototype上*//** *获取任意变量的[[Class]]属性,ES6中以internal slot取代[[Class]]属性 * 'St
Object instanceof Function; // true Function instanceof Object; // true /*判断左边的原型链__proto__是否在右边的prototype上*/ /** *获取任意变量的[[Class]]属性,ES6中以internal slot取代[[Class]]属性 * 'String' 'Boolean' 'Function' 'Object' 'Number' 'Array' 'Undefined' 'Null' 'Math' 'RegExp' * 'Window' 'Navigator' */ function getClass (a) { const str = Object.prototype.toString.call(a); return /^\[object (.*)\]$/.exec(str)[1]; } /*改变Object.prototype.toString.call的结果*/ Object.defineProperty(obj, Symbol.toStringTag, { get: function() { return 'new Class'; } }); // Object.defineProperty中 set()、get()和value、writable互斥 /* prototype表示原型,property表示属性, __proto__用于读取对象原型 */ /* total 23 [ 'length', 'name', 'prototype', 'create', 'assign', 创建新对象 'getOwnPropertyNames', 不论是否可枚举,都会显示出来 'getOwnPropertyDescriptors', ES8新增特性 'getOwnPropertyDescriptor', 'getOwnPropertySymbols', 'is', ES6新增 'preventExtensions', 组织向一个对象添加更多属性 'isExtensible', 'seal', 密封一个对象,止咳变更现有属性的值,不可删除和配置 'isSealed', 'freeze', 冻结一个对象,只可枚举 'isFrozen', 'defineProperty', 'defineProperties', 'getPrototypeOf', 'setPrototypeOf', 读取或设置对象实例的原型 'keys', 'entries', 'values' ES8新增特性 ] */ Object.getOwnPropertyNames(Object); /* total 12 [ 'constructor', '__defineGetter__', '__defineSetter__', 'hasOwnProperty', '__lookupGetter__', '__lookupSetter__', 'isPrototypeOf', 'propertyIsEnumerable', 'toString', 描述目标对象的字符串 'toLocalString', 'valueOf', '__proto__', ] */ Object.getOwnPropertyNames(Object.prototype); // value默认undefined, writable、configurable、enumerable默认false,通过对象字面量添加的属性默认都是true,即可被Object.keys循环出来 // 获取对象属性描述, {[name]: {writable: [Boolean], enumerable: [Boolean], configurable: [Boolean], value: [Function]}} Object.getOwnPropertyDescriptors(Object); Object.getOwnPropertyDescriptors(Object.prototype); Object.getOwnPropertyDescriptor(Object.prototype, 'toString'); //setPrototypeOf 设置对象原型 // ES6 var obj = { method: function(){} } obj.__proto__ = someOtherObj; // __proto__是非标准属性,不建议使用,使用setPrototypeOf替代 // ES5 var obj = Object.create(someOtherObj); obj.method = function(){} Object.getOwnPropertySymbols({a:1, [Symbol('b')]: 2}); // [Symbol(b)] // 对象的===是如何比较的? // https://github.com/sindresorhus/object-assign // Object.assign(target, ...source)只复制自身属性,不可枚举的属性不复制,改变原target对象,所以建议target使用{} Object.assign({a: 1}, {[Symbol('b')]: 2}); // {a: 1, Symbol(b): 2} Object.assign([1,2,3], [4,5]); // [4,5,3] // Object.keys 只显示可枚举的属性