一、面向对象
从设计模式上看,对象是计算机抽象现实世界的一种方式。面向对象编程(object-oriented programming)的最主要目的是提高程序的重复使用性。
我们说,对象具有属性(property)和方法(function),(其实本质上方法也是一种属性)在面向对象的设计模式中,属性是一种描述,描述对象的状态,比如一个人一天 24 小时的情绪,每个时刻他的情绪都具有不同的状态,喜怒哀乐,抑郁癫狂,贪嗔痴念,当然情绪只是生而为人的众多状态中的一种而已。而对象中的方法是一种功能,它的功能就是操作对象的属性。比如,吃饭可以改变一个人的状态,对吃货而已,吃饱以后会觉得特别幸福,吃饭是一种功能,它改变了一个人的情绪,让人觉得幸福。
那么,反过来细想,人是一个对象,它具有情绪,他还要吃饭。所以可以说,对象是对属性和方法的一种封装。
在JavaScript里,同样认为“万物皆对象”,JavaScript提供了一个Object对象,是JavaScript所有对象的基类, 即那些对象都是Object的实例对象,换句话说JavaScript中的所有对象都是由Object对象衍生的,本篇来聊一聊这个Object对象。
二、Object函数
Object本身是一个函数(理解这一点,请移步 JavaScript中函数的三种角色),可以当作工具方法使用,将任意值转为对象。这个方法常用于保证某个值一定是对象。如果参数为空(或者为undefined和null),Object()返回一个空对象。
1 | var obj = Object(); |
上面代码的含义,是将undefined和null转为对象,结果得到了一个空对象obj。
instanceof运算符用来验证,一个对象是否为指定的构造函数的实例。obj instanceof Object返回true,就表示obj对象是Object的实例。
如果参数是原始类型的值,Object方法将其转为对应的包装对象的实例。
1 | var obj = Object(1); |
上面代码中,Object函数的参数是各种原始类型的值,转换成对象就是原始类型值对应的包装对象。
如果Object方法的参数是一个对象,它总是返回该对象,即不用转换。
1 | var arr = []; |
利用这一点,可以写一个判断变量是否为对象的函数。
1 | function isObject(value) { |
三、Object构造函数
Object不仅可以当作工具函数使用,还可以当作构造函数使用,即前面可以使用new操作符。Object构造函数的首要用途,是直接通过它来生成新对象。
Object构造函数的用法与工具方法很相似,几乎一模一样。使用时,可以接受一个参数,如果该参数是一个对象,则直接返回这个对象;如果是一个原始类型的值,则返回该值对应的包装对象1
2
3
4
5
6var o1 = {a: 1};
var o2 = new Object(o1);
o1 === o2 // true
var obj = new Object(123);
obj instanceof Number // true
虽然用法相似,但是Object(value)与new Object(value)两者的语义是不同的,Object(value)表示将value转成一个对象,new Object(value)则表示新生成一个对象,它的值是value。
Object.keys()与Object.getOwnPropertyNames()
这两个方法都是用来遍历对象的属性的
Object.keys方法的参数是一个对象,返回一个数组。该数组的成员都是该对象自身的(而不是继承的)所有属性名。1
2
3
4
5
6var obj = {
p1: 123,
p2: 456
};
Object.keys(obj) // ["p1", "p2"]
Object.getOwnPropertyNames方法与Object.keys类似,也是接受一个对象作为参数,返回一个数组,包含了该对象自身的所有属性名。1
2
3
4
5
6var obj = {
p1: 123,
p2: 456
};
Object.getOwnPropertyNames(obj) // ["p1", "p2"]