Javascript是一门很灵活多变的语言,也是一门面向对象的语言。在JS的世界里,有“函数是一等公民”“一切皆对象”的说法。
在JS里,对象指的是可变的键控集合。Javascript里有Number,Array,Function,Object,Boolean,Regex,String,Undefined,Null九种类型。在这里面,Array,Function,Object,Regex是对象。
对象是无类型的,并且可以嵌套。对象所包含的是一组名值对的集合,这里的“名”也称作属性,“值”又称作属性值。
那么,我们如何创建一个对象呢?我们该如何使用对象呢?现在我们来一一解答
创建对象
关于如何创建一个对象,一般熟悉Javascript的人能够回答上来两种方法:
第一种:
var newObj = new Object();
第二种:
var newObj = {};
但是,Javascript还为我们提供了第三种创建对象的方法,那就是Object.create()
方法:
var newObj = Object.create({});
对象字面量(对象的属性存储)
在Javascript的对象里,我们采用对象字面量的方式来存储名值对到对象里:
var newObj = {
key1: 'value1', //如果值是String类型必须用引号包含
key2: 123 //如果值是Number类型,那么不用引号
};
当然,我们属性名和属性值的格式也可以采用JSON的格式:
var newObj = {
"key1": "value1",
"key2": 123
};
关于属性名的格式,如果属性名里包含了短横线,那么,属性名必须使用引号包含,但是,如果是包含的下划线,那么,可以不使用引号包含,比如:
var newObject = {
key1_name: 'name1',
'key2-name': 'name2'
};
对象是可以嵌套的:
var newObj = {
name: 'Erichain',
info: {
sex: male,
age: 21
}
};
对象的属性值可以是任意的数据类型:
var newObj = {
newStr: 'this is a string', //String
newNumber: 123, //Number
newBoolean: true, //Boolean
newArray: [1, 2, 3], //Array
newFunction: function () {} //Function
//and so on...
};
对象属性的查找与检索
与其它的语言(比如Java,C等)类似,Javascript里的属性查找可以使用小数点的方式:
var newObj = {
name: 'Erichain',
age: 21
};
console.log(newObj.name);
>> Erichain
也可以使用[属性名]
的方式:
var newObj = {
name: 'Erichain',
age: 21
};
console.log(newObj['name']);
>> Erichain
同样的,使用小数点的方式访问属性的时候,属性名不能是数字,或者包含有各种符号的。如果有包含符号的属性名,就只能使用[属性名]
的方式访问属性。一般优先考虑使用小数点访问的方式。
如果尝试去访问一个不存在的属性的话,将会返回undefined
:
var newObj = {
name: 'Erichain',
age: 21
};
console.log(newObj.girlfriend);
>> undefined //够形象了吧
对象属性的更新
Javascript的对象的属性值是可以实时更新的。属性的个数也可以随时进行添加。
var newObj = {
name: 'Erichain',
age: 21
};
console.log(newObj.name);
>> Erichain
//更新属性值
newObj.name = 'Zain';
console.log(newObj.name);
>> Zain
//添加新属性
newObj.girlfriend = true;
console.log(newObj);
>> newObj = {
name: 'Zain',
age: 21,
girlfriend: true
};
有了属性的添加,肯定就会有属性的删除。我们使用delete
来对对象的属性进行删除:
var newObj = {
name: 'Erichain',
age: 21
};
console.log(newObj.name);
>> Erichain
delete newObj.name;
console.log(newObj.name);
>> undefined
对象的委托
Javascript的对象都会有一个叫做prototype
的属性,所有的对象的prototype
都是Object。当我们访问对象的属性值的时候,对象会首先在本对象里面寻找,如果找不到,那么就会到prototype
里面去找,这个寻找的过程就称作委托。
我们可以看一个例子来理解:
var newObj = {
name: 'Erichain',
age: 21
};
newObj.prototype.getAge = function () {
return this.age;
};
console.log(newObj.getAge());
>> 21
我们没有在newObj里面定义getAge()
方法,但是,我们在它的原型上定义了这个方法,所以,它在本地找不到的时候,会去原型上查找这个方法。这就是委托的过程。
属性的枚举
想要枚举Javascript对象的属性,我们可以使用for in
方法,也可以使用for循环,其中,for in
不会按照属性的顺序来进行枚举:
var newObj = {
name: 'Erichain',
age: 21
};
//使用for in
for( var name in obj ) {
console.log(obj[name] + '\n');
}
//使用for循环
//首先,定义一个数组,来存放相关的属性名
var keyName = ['name', 'age'];
for( var i = 0; i < newObj.length; i++ ) {
console.log(keyName[i] + ':' + newObj[keyName[i]] + '\n');
}
全局命名空间
关于Javascript的全局命名空间,我们为了不污染这个空间,一般是在一个js文件里,我们定一个对象,将其他的方法等,都写在这个对象里面:
var namespace = {};
namespace.initial = function () {};
namespace.getSomeValue = function () {};
//and so on...
对象的方法
关于对象的方法,我在这里只简单的介绍一个,就是hasOwnProperty
,用来判断一个对象是否含有某个属性:
var newObj = {
name: 'Erichain',
age: 21
};
console.log(newObj.hasOwnProperty('name'));
>> true
console.log(newObj.hasOwnProperty('girlfriend'));
>> false
关于Javascript的对象,要说的话,十篇博文都说不完,这里,是我个人总结了一些常用的东西。如果想要深入学习,大家可以找我互相交流。