当前位置 : 主页 > 网络编程 > JavaScript >

对象API解析

来源:互联网 收集:自由互联 发布时间:2021-06-28
Object.js Object instanceof Function; // trueFunction instanceof Object; // true/*判断左边的原型链__proto__是否在右边的prototype上*//** *获取任意变量的[[Class]]属性,ES6中以internal slot取代[[Class]]属性 * 'St
Object.js
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 只显示可枚举的属性
网友评论