这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战
前言
Object作为函数和对象,有不同的方法和属性,很容易搞混,这次做个总结,先总结一下作为函数时的方法和属性,再总结作为对象时(自身的和原型上的)属性。
Object作为函数
Object(value): 将任意值转换为对象如果参数var obj = Object(); // {} var obj = Object(111); // Number {111} // 等同于 var obj = Object(undefined); // {} var obj = Object(null); // {}value是一个基础数据类型,则转换为对应的包装对象var obj = Object(1); obj instanceof Object // true obj instanceof Number // true注意:
instanceof运算符用来验证,一个对象是否为指定的构造函数的实例。obj instanceof Object返回true,就表示obj对象是Object的实例。 如果参数value是一个引用数据类型,对象或者数组或者函数,则不用转换。 利用这一点,可以写一个判断变量是否为对象的函数。// 判断一个数是否是对象 function isObject(value) { // 如果value是基本数据类型,则转换为对应的包装对象 // 如果是对象,则什么都不干 return value === Object(value) } console.log(isObject(111)) // false console.log(isObject([])) // true
Object作为构造函数
前面可以加new命令来生成一个对象,但是这种生成对象有点麻烦,现在是用var obj = {}来快速生成一个对象。(两种方法生成对象是等价的,只是后面的写法更简洁)
注意:
new Object(value)和上述的Object(value)方法用法是一模一样,但是性质不一样,前者返回一个新的对象,后者是将value转成一个对象,在内存中都会开辟一块存储空间来存这个对象。
Object自身的方法
-
Object.keys(obj)参数是一个对象,返回一个数组。该数组的成员都是该对象自身的(而不是继承的)所有属性名。
var obj = { p1: 123, p2: 456 }; Object.keys(obj) // ["p1", "p2"] -
Object.getOwnPropertyNames()该方法和
Object.keys(obj)看似一样,但是有一个不同的地方是,Object.getOwnPropertyNames()可以返回枚举属性和不可枚举属性,而Object.keys(obj)只返回可枚举属性。var a = ['Hello', 'World']; Object.keys(a) // ["0", "1"] Object.getOwnPropertyNames(a) // ["0", "1", "length"]数组的
length属性是不可枚举的属性,所以只出现在Object.getOwnPropertyNames方法的返回结果中。在一般情况下,
Object.keys(obj)用的比较多。 -
属性描述对象:
Object.getOwnPropertyDescriptor(对象,属性)获取某个属性的描述对象。这个属性的描述对象里面,包含了4个属性。查看该属性能否改写,能否枚举。当然可以修改描述对象。
const obj = { aaa: 111 } console.log(Object.getOwnPropertyDescriptor(obj, 'aaa')) // { // configurable: true, // enumerable: true, // value: 111, // writable: true // } -
修改某个属性对应的描述对象
Object.defineProperty(对象,属性,更改的配置)Object.defineProperty(obj, 'aaa', { writable: false // 不可改写 }) obj.aaa = 222 // 在非严格模式下不会报错,在严格模式下会报错。 console.log(obj)// {aaa: 111}这两个方法是获取对象属性,主要是查看当前属性能否改写,或者控制某些属性,不能改写。
-
控制对象状态的方法
Object.freeze():冻结一个对象。` -
Object.isFrozen():判断一个对象是否被冻结。 -
原型链相关方法
Object.create():这个是以指定的对象为原型来创建一个新的对象。
const person = { isHuman: false, printIntroduction: function () { console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`); } }; let newobj = Object.create(person) console.log(person === newobj.__proto__) // true console.log(newobj.__proto__) // { // isHuman: false, // printIntroduction: function () { // console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`); // } // };
Object实例方法
实例方法主要有6个,定义在Object.prototype上,所有的实例都可以用这个方法。
-
Object.prototype.valueOf()返回对象的值,
obj === obj.valueOf()为true。主要用途是在数据类型转换中可以使用。
var obj = new Object(); 1 + obj // "1[object Object]"上述代码会先调用
valueOf()拿到对象的值(也就是该对象本身),再调用toString()转换成基础类型。toString()后面会说。所以,我们可以自己更改这个实例的方法,来覆盖掉原型上的方法。var obj = new Object(); obj.valueOf = function () { return 2; }; // 更改这个实例的方法,来覆盖掉原型上的方法。 1 + obj // 3 -
Object.prototype.toString()返回一个对象的字符串格式,一般是
"object object",但是返回这个意义不大,可以和上述提到的valueOf()方法一样,自己改写,然后覆盖掉原型上的方法。var obj = new Object(); obj.toString = function () { return 2; }; // 更改这个实例的方法,来覆盖掉原型上的方法。 1 + obj // 3
数组、字符串、函数、Date 对象都分别部署了自定义的toString方法,覆盖了Object.prototype.toString方法。
扩展:
Object.prototype.toString.call(value)方法返回这个value具体的数据类型。这个.call()等我查一下,搞清楚了再来更新。
-
Object.prototype.hasOwnProperty(属性)用来判断该属性是否是自身的属性,不是继承自原型的属性,是自身的属性,返回true,继承自原型上的,就返回false。var obj = { p: 123 }; obj.hasOwnProperty('p') // true obj.hasOwnProperty('toString') // false在项目中具体哪里使用还没用到,等用到了再来补充吧。