引用类型之 Object(二)

导读:本节内容接着上一节继续讲吧,我们再来认识几个 Object 类型构造函数的方法。

(7)Object.isExtensible ( O )、Object.isFrozen ( O )、Object.isSealed ( O )

这三个函数想必大家都知道是什么意思了吧,就是对于上一节所描述的那三个看起来很像但有区别的方法量身定做的方法。返回 truefalse

代码示例:

let obj = {
    a: 'Hello',
    b: 'World'
};
Object.freeze(obj);
console.log( Object.isFrozen(obj) );  // true

这三个方法的用法都是一致的。所以呢,就不一一介绍了。


(8)Object.getOwnPropertyDescriptor ( O, P )、Object.getOwnPropertyDescriptors ( O )

概述:该方法返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性);Object.getOwnPropertyDescriptors() 方法用来获取一个对象的所有自身属性的描述符。

代码示例:

let obj = {
    a: 'Hello',
    b: 'World'
};
// 以下两种方法等价
console.log( Object.getOwnPropertyDescriptor(obj,'a','b') );
console.log( Object.getOwnPropertyDescriptors(obj) );

输出结果如下:

引用类型之 Object(二)_第1张图片
输出结果

Object.getOwnPropertyDescriptors() 这个方法属于 ES2017 的草案中的方法。虽然浏览器识别了,但是在使用 ES6 版本的 IDE 中却没有识别出该方法。因此,如非必要,暂时不要在生产环境中使用它。


(9)Object.getOwnPropertyNames ( O )

概述:该方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性)组成的数组。

代码示例:

let obj = {
    a: 'Hello',
    b: 'World'
};
console.log( Object.getOwnPropertyNames(obj) );

输出结果:

引用类型之 Object(二)_第2张图片
输出结果

这个方法很好理解,顾名思义嘛。需要注意的是,获取的结果是一个数组哦。


(10)Object.getOwnPropertySymbols ( O )

概述:该方法会返回一个数组,该数组包含了指定对象自身的(非继承的)所有 symbol 属性键。

代码示例:

let obj = {
    a: 'Hello',
    [Symbol('foo')]: 'World'
};
console.log( Object.getOwnPropertyNames(obj) );  // ["a"]

输出的结果自包含 "a",而不会显示 Symbol 类型作为键的属性名,因此我们会用到该方法:

let obj = {
    a: 'Hello',
    [Symbol('foo')]: 'World'
};
console.log( Object.getOwnPropertySymbols(obj) );  // [Symbol(foo)]

而该方法则只会显示以 Symbol 类型作为键的属性名的数组。


(11)Object.keys ( O )

概述:该方法会返回一个由给定对象的所有可枚举自身属性的属性名组成的数组,数组中属性名的排列顺序和使用 for-in 循环遍历该对象时返回的顺序一致 (顺序一致不包括数字属性)(两者的主要区别是 for-in 还会遍历出一个对象从其原型链上继承到的可枚举属性)。

根据这段话我们已经得出结论了,for-in 不靠谱就在于它会遍历出原型链上的可枚举属性名,而我们使用该方法则只遍历该对象上的可枚举属性名。这里还是注意:返回的是一个数组


(12)Object.getPrototypeOf ( O )

该方法返回指定对象的原型。

代码示例:

let proto = {};
let obj = Object.create(proto);
console.log(Object.getPrototypeOf(obj) === proto); // true

(13)Object.is ( value1, value2 )

概述:该方法用来判断两个值是否是同一个值。

该方法是 ES5 中的方法。

代码示例:

Object.is('foo', 'foo');  // true
Object.is('foo', 'bar');  // false
Object.is([], []);  // false

目前暂时为看出该方法应该如何使用较好。


(14)Object.values ( O )

概述:Object.values() 方法返回一个包含指定对象所有的可枚举属性值的数组,数组中的值顺序和使用 for-in 循环遍历的顺序一样(不同的是:for-in循环同时返回了该对象原型链上的可枚举属性值,而 **Object.values() 不包括)。

该方法是 ES2017 草案中的方法,不过我认为最终会实现的。

与前面所讲的 Object.getOwnPropertyNames() 方法是不是很相似啊?没错,就是这样,该方法返回的是属性值;而 Object.getOwnPropertyNames() 方法返回的则是属性名。记住一点,他们返回的都是数组哦。


(15)Object.entries ( O )

概述:该方法返回一个包含由给定对象所有可枚举属性的属性名和属性值组成的 [属性名,属性值] 键值对的数组,数组中键值对的排列顺序和使用 for-in 循环遍历该对象时返回的顺序一致(两者的主要区别是 for-in 还会遍历出一个对象从其原型链上继承到的可枚举属性)。

纳尼?这个方法不就是前面所讲的两个方法的合体版本吗!哈哈。聪明的你,一定发现了对吧。

代码示例:

let obj = {
    a: 'Hello',
    b: 'World'
};
console.log( Object.entries(obj) );  // [ ["a","Hello"],["b","World"] ]

就是如此的简单明了,我们学习完以后,一定会将这三个方法串在一起并且都能记住对吧。


(16)Object.setPrototypeOf ( O, proto )

概述:该方法将一个指定的对象的原型设置为另一个对象或者 null。

我们刚学习完 Object.getPrototypeOf() 方法,就来了一个这个方法。说明,我们的原型设置完以后不能修改,会很麻烦。所以就有了这么个方法,可以改变从前所设置的原型,将其改变到另一个对象上去。

该方法是 ES6 中新添加的方法。

代码示例:

let obj = {
    a: 'Hello',
    b: 'World'
};
let obj1 = Object.create(obj);
console.log( Object.getPrototypeOf(obj1) === obj );  // true

let obj2 = {};
Object.setPrototypeOf(obj1,obj2);
console.log( Object.getPrototypeOf(obj1) === obj );  // false
console.log( Object.getPrototypeOf(obj1) === obj2 );  // true

从该示例我们就可以看的很清楚啦,将原型对象进行转移是如何做到的。


总结

Object 类型的构造函数的方法就讲到这里啦。和以前一样,接下来我们会讲述 Object 类型的原型方法。大家拭目以待吧。


相关链接:

引用类型之 Object(三)

你可能感兴趣的:(引用类型之 Object(二))