更多方法见 MDN

MDN - Object

方法 作用 返回值 原对象是否改变 备注
assign(target, ...sources) 将所有可枚举属性的值从一个或多个源对象复制到目标对象 目标对象
create(proto[, propertiesObject]) 创建一个新对象, 使用现有的对象来提供新创建的对象的proto 一个新对象, 带着指定的原型对象和属性 如果 propertiesObject 参数是 null 或者非原始包装对象, 则抛出一个 TypeError 异常; 有点类似于继承的概念
defineProperty(obj, prop, descriptor) 直接在一个对象上定义一个新属性, 或者修改一个对象的现有属性 被传递给函数的对象
defineProperties(obj, props) 直接在一个对象上定义新的属性或修改现有属性 传递给函数的对象 props: 要定义其可枚举属性或修改的属性描述符的对象, 对象中存在的属性描述符主要有两种: 数据描述符和访问器描述符
getPrototypeOf(object) 返回指定对象的原型对象 给定对象的原型; 如果没有继承属性, 则返回 null
setPrototypeOf(obj, prototype) 设置对象的原型(即内部 [[Prototype]] 属性)
entries(obj) 返回给定对象自身可枚举属性的 [key, value] 数组, 其排列与使用 for…in 循环遍历该对象时返回的顺序一致 给定对象自身可枚举属性的键值对数组
keys(obj) 返回一个包含所有给定对象自身可枚举属性名称的数组 一个表示给定对象的所有可枚举属性的字符串数组 数组中属性名的排列顺序和使用 for…in 循环遍历该对象时返回的顺序一致
values(obj) 返回给定对象自身可枚举属性组成的数组 一个包含对象自身的所有可枚举属性值的数组 值的顺序与使用for…in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )
getOwnPropertyDescriptor(obj, prop) 返回指定对象上一个自有属性对应的属性描述符, obj 需要查找的目标对象, prop 目标对象内属性名称 如果指定的属性存在于对象上, 则返回其属性描述符对象(property descriptor), 否则返回 undefined 自有属性指的是直接赋予该对象的属性, 不需要从原型链上进行查找的属性
getOwnPropertyDescriptors(obj) 获取一个对象的所有自身属性的描述符 所指定对象的所有自身属性的描述符, 如果没有任何自身属性, 则返回空对象
getOwnPropertyNames(obj) 返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组 在给定对象上找到的自身属性对应的字符串数组
getOwnPropertySymbols(obj) 返回一个给定对象自身的所有 Symbol 属性的数组 在给定对象自身上找到的所有 Symbol 属性的数组 和 getOwnPropertyNames 相似
getPrototypeOf(object) 返回指定对象的原型(内部[[Prototype]]属性的值, obj 要返回其原型的对象 给定对象的原型; 如果没有继承属性, 则返回 null 不是 Object.prototype
freeze(obj) 冻结一个对象 被冻结的对象 在严格模式下, 一个被冻结的对象再也不能被修改
isFrozen(obj) 判断一个对象是否被冻结 表示给定对象是否被冻结的Boolean
is(value1, value2) 比较两个值是否相同 表示两个参数是否相同的布尔值 所有 NaN 值都相等(这与==和===不同)
isExtensible(obj) 判断一个对象是否是可扩展的(是否可以在它上面添加新的属性) 表示给定对象是否可扩展的一个Boolean 新对象是可以拓展的, 可变的、密封对象、冻结对象都是不可拓展的
isSealed(obj) 判断一个对象是否被密封 表示给定对象是否被密封的一个Boolean
preventExtensions(obj) 让一个对象变的不可扩展, 也就是永远不能再添加新的属性 已经不可扩展的对象
fromEntries(iterable) 把键值对列表转换为一个对象 一个由该迭代对象条目提供对应属性的新对象
hasOwnProperty(prop) 指示对象自身属性中是否具有指定的属性 用来判断某个对象是否含有指定的属性的布尔值 Boolean 所有继承了 Object 的对象都会继承到 hasOwnProperty 方法, 和 in 运算符不同, 该方法会忽略掉那些从原型链上继承到的属性
prototypeObj.isPrototypeOf(object) 测试一个对象是否存在于另一个对象的原型链上 表示调用对象是否在另一个对象的原型链上的布尔值 如果 prototypeObj 为 undefined 或 null, 会抛出 TypeError
propertyIsEnumerable(prop) 判断指定的属性是否可枚举 用来表示指定的属性名是否可枚举的布尔值 此方法可以确定对象中指定的属性是否可以被 for…in 循环枚举, 但是通过原型链继承的属性除外
toLocaleString() 返回一个该对象的字符串表示 表示对象的字符串 此方法被用于派生对象为了特定语言环境的目的(locale-specific purposes)而重载使用
toString() 返回一个表示该对象的字符串 一个表示该对象的字符串
valueOf() 返回指定对象的原始值 返回指定对象的原始值 JavaScript 调用 valueOf 方法将对象转换为原始值; 很少需要自己调用valueOf方法; 当遇到要预期的原始值的对象时, JavaScript 会自动调用它
seal(obj) 封闭一个对象, 阻止添加新属性并将所有现有属性标记为不可配置 被密封的对象 当前属性的值只要原来是可写的就可以改变

继承属性/方法

Function

属性

  • Function.arguments
  • Function.caller
  • Function.displayName
  • Function.length
  • Function.name

方法

  • Function.prototype.apply()
  • Function.prototype.bind()
  • Function.prototype.call()
  • Function.prototype.toSource()
  • Function.prototype.toString()

使用及拓展

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// assign
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
console.log(target) // {a: 1, b: 4, c: 5}
console.log(returnedTarget) // {a: 1, b: 4, c: 5}

// properties
var obj = {};
Object.defineProperties(obj, {
'property1': {
value: true,
writable: true
}
})

// freeze
const obj = { prop: 42 };
Object.freeze(obj);
obj.prop 33 // Throws an error in strict mode

// fromEntries
const entries = new Map([
['foo', 'bar'],
['baz', 42]
]);
const obj = Object.fromEntries(entries);
console.log(obj); // Object { foo: "bar", baz: 42 }

// getOwnPropertyDescriptor
var o = { get foo() { return 17; } };
var d = Object.getOwnPropertyDescriptor(o, "foo"); // ...描述符

// getOwnPropertyNames
var arr = ["a", "b", "c"];
console.log(Object.getOwnPropertyNames(arr).sort()); // ["0", "1", "2", "length"]

// getPrototypeOf
var proto = {};
var obj = Object.create(proto);
Object.getPrototypeOf(obj) === proto; // true

// isExtensible
var empty = {};
Object.isExtensible(empty) // true

// toString
var o = new Object();
o.toString(); // returns [object Object]

defineProperty

  • 语法: Object.defineProperty(obj, prop, descriptor)
  • 参数
    • obj 要定义属性的对象
    • prop 要定义或修改的属性名称或 Symbol
    • descriptor 要定义或修改的属性描述符
      • 布尔值的键: (默认值都是 false)
        • configurable: 当且仅当该属性的 configurable 键值为 true 时, 该属性的描述符才能够被改变, 同时该属性也能从对应的对象上被删除
        • enumerable: 当且仅当该属性的 enumerable 键值为 true 时, 该属性才会出现在对象的枚举属性中
        • writable: 当且仅当该属性的 writable 键值为 true 时, 属性的值, 也就是 value, 才能被赋值运算符改变
      • 属性值和函数的键: (默认值都是 undefined)
        • value: 该属性对应的值; 可以是任何有效的 JavaScript 值(数值、对象、函数等)
        • get: 属性的 getter 函数, 如果没有 getter, 则为 undefined; 当访问该属性时, 会调用此函数; 执行时不传入任何参数, 但是会传入 this 对象(由于继承关系, 这里的this并不一定是定义该属性的对象); 该函数的返回值会被用作属性的值
        • set: 属性的 setter 函数, 如果没有 setter, 则为 undefined; 当属性值被修改时, 会调用此函数; 该方法接受一个参数(也就是被赋予的新值), 会传入赋值时的 this 对象
  • 这个方法可以精确添加/修改对象的属性, 且在默认情况下, 使用该方法添加的属性值是不可修改(immutable)的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 使用 __proto__
var obj = {};
var descriptor = Object.create(null); // 没有继承的属性
// 默认没有 enumerable, 没有 configurable, 没有 writable
descriptor.value = 'static';
Object.defineProperty(obj, 'key', descriptor);

// 显式
Object.defineProperty(obj, "key", {
enumerable: false,
configurable: false,
writable: false,
value: "static"
});

// 循环使用同一对象
function withValue(value) {
var d = withValue.d || (
withValue.d = {
enumerable: false,
writable: false,
configurable: false,
value: null
}
);
d.value = value;
return d;
}
// ... 并且 ...
Object.defineProperty(obj, "key", withValue("static"));

// 如果 freeze 可用, 防止后续代码添加或删除对象原型的属性
// (value, get, set, enumerable, writable, configurable)
(Object.freeze||Object)(Object.prototype);

valueOf

  • 每一种基本数据类型的构造函数的原型上都有一个 valueOf 方法
  • Object.prototype 的原型上也有 valueOf 方法
  • 基本类型
    • valueOf: 获取原始值 [[PrimitiveValue]]
    • toString: 将原始值转换为字符串
  • 隐式转换
    • num.valueOf() 先获取原始值
    • [[PrimitiveValue]].toString() 把获取的原始值转换为字符串

不同类型对象的 valueOf() 方法的返回值

对象 返回值
Array 返回数组对象本身
Boolean 布尔值
Date 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC
Function 函数本身
Number 数字值
Object 对象本身; 这是默认情况
String 字符串值

Math 和 Error 对象没有 valueOf 方法

如何去循环遍历一个对象? for in 循环

1
2
3
4
5
let o = new Object({name: 'mars', age: 18, address: 'China'})
for (let i in o) {
console.log(i) // name age address
console.log(o[i]) // 'mars' 18 'China'
}