JavaScript对象基础
创建一个JavaScript对象的不同方式有哪些?
- 构造函数模式:像Object和Array这样的原生构造函数,在运行时会自动出现在执行环境中,此外我们也可以创建自定义的构造函数,从而定义自定义对象类型的属性和方法
function student (name, age) {
this.name = name;
this.age = age;
this.greeting = function() {
console.log('Hi, I am ' + this.name);
}
}
var obj = new student('Bob', 20);
- 用
new
关键字创建一个Object的实例,再为它添加属性和方法
var student = new Object();
student.name = 'Bob';
student.age = 20;
student.greeting = function() {
console.log('Hi, I am ' + this.name);
}
- 对象字面量
var student = {
name: 'Bob',
age: 20,
greeting: function() {
console.log('Hi, I am ' + this.name);
}
}
基础的创建对象的方式一般即为以上三种,其余方法为基础方法之外的方法,现挑选部分方法罗列如下:
- ECMASCRIPT 6 引入了新的关键字
class
来创建对象,此方法并没有添加新的逻辑或内容给javascript,只是对于习惯使用其他面向对象编程语言的开发人员来说更为友好,例子如下:
class student {
constructor(name, age) {
this.name = name;
this.age = age;
this.greeting = function() {
console.log('Hi, I am ' + this.name);
}
}
}
var student1 = new student('Bob', 20);
- 利用
Object.create()
方法来创建对象
var student = {
name: 'Bob',
age: 20,
greeting: function() {
console.log('Hi, I am ' + this.name);
}
}
var student2 = Object.create(student);
student2.name = 'Alice';
student2.age = 21;
如何添加/删除属性?
我们先来看一段代码:
var student = {
name: 'Bob',
age: 20,
greeting: function() {
console.log('Hi, I am ' + this.name);
}
}
delete student.age;
student.gender = 'Male';
console.log(student);
输出结果为:
{ name: 'Bob', greeting: [Function: greeting], gender: 'Male' }
在上述代码中,首先我们创建了一个名为student
的对象,对应有属性name
,age
和方法greeting()
.
然后我们通过delete
删除了其中的一个属性age
,并且通过直接赋值的方式为其添加了一个属性gender
.
通过[]
和 .
访问/修改对象属性的区别是什么?
首先明确一点,不论是通过[]
还是.
都可以顺利的访问和修改已经定义过的对象的任何属性,然而在某些场景下,这两个还是有区别的。
-
需要新添加一个属性,该属性名中含有空格
假设还是前文提到的student
对象,如果我们想要给他新增加一个属性名为class number
的属性。如果此时我们想通过.
的方式来增加属性,则应该写为:student.class number = 2;//SyntaxError: Unexpected identifier
很明显此时会报错。但如果我们使用
[]
的方式来添加,则没有任何问题:student['class number'] = 2;
-
需要新添加一个属性,属性名需要动态变化,举例如下:
for (var i=0; i<=4; i++) { myObject['prop' + i] = i; }
在上述例子中,我们需要添加的属性名的一部分包含一个变量,只能借由
for
循环和[]
的方式添加。如何分别获取对象中属性和值?
首先明确一点,对于JavaScriptd中的对象,我们可以认为其是由键值对(key value pair)组成的,属性名即为
key
,属性值即为value
.假设我们想单独的提取出一个对象中的所有属性或者属性值,并存入对应的数组中,应该怎么做?我们只需要调用
Object.keys()
和Object.values()
即可。示例请看如下代码:var student = { name: 'Bob', age: 20, greeting: function() { console.log('Hi, I am ' + this.name); } } var prop = Object.keys(student); var value = Object.values(student); console.log(prop); // 输出为 [ 'name', 'age', 'greeting' ] console.log(value); // 输出为 [ 'Bob', 20, [Function: greeting] ]
如何遍历对象的属性和值?
在上一小节我们知道了如何分别获取对象中的属性和值,并且把他们存入了不同数组中。但在实际使用中,有时候我们并不需要把对象的属性和值分别拿出来,而是需要遍历处理。
那么如何进行遍历处理呢?我们可以通过for in
的语法去遍历一个对象,举例如下:
var fruit = {
apple: 20,
pear: 20,
peach: 10
};
var totalNum = 0;
for (let fruitElem in fruit) {
if (fruit.hasOwnProperty(fruitElem)) {
totalNum = fruit[fruitElem] + totalNum;
}
}
console.log(totalNum);
在此例中,我们有一个名为fruit
的对象,我们做的是遍历处理该对象,将对象所有属性的值相加并且打印输出。
在此需要注意的是,使用for in
遍历对象时, 需要使用hasOwnProperty
过滤掉原型中的属性,从而保证我们所处理的都是自己定义的属性。
浅谈JSON
聊到JavaScript对象,就不得不也同时聊一聊JSON.
首先,先看定义,JSON是一种轻量级的数据交换格式,全称为JavaScript对象表示法(JavaScript Object Notation)。所以说我们其实可以把JSON看作是一种存储数据的格式类型,或者说一种数据规范。
JSON这种数据格式用JS对象字面量的表示方法进行描述,那么描述JSON的语法就是JS对象字面量表示法语法的一个子集。但是于JavaScript不同的是,要注意JSON在描述属性时,属性需要用双引号包含住,并且JSON描述的对象不能有任何方法存在。
他的本质是文本文档,只不过需要按照JSON的格式书写,并且其文件后缀为.json
.
更多关于JSON的详细介绍,请移步MDN官方的JSON使用简介.