Object 对象
JavaScript所有的事物都是可以称为对象,例如String、Number、Array、Function...
一、js如何创建对象
1.工厂模式 new Object()
通过该方法可以大批量的创建对象。
/*
* 使用工厂方法创建对象
* 通过该方法可以大批量的创建对象
*/
function createPerson(name, age, gender) {
//创建一个新的对象
const obj = new Object();
//向对象中添加属性
obj.name = name;
obj.age = age;
obj.gender = gender;
obj.sayName = function () {
alert(this.name);
};
//将新的对象返回
return obj;
}
const obj2 = createPerson('猪八戒', 28, '男');
const obj3 = createPerson('白骨精', 16, '女');
const obj4 = createPerson('蜘蛛精', 18, '女');
第一次看到这种工厂模式时,你可能会觉得陌生。如果简化一下,可以写成下面这种形式,更容易理解:(也就是,利用 new Object 创建对象)
const obj = new Obect();
obj.name = '猪八戒';
obj.age = 28;
obj.gender = '男';
obj.sayHi = function () {
alert('hello world');
};
弊端: 使用工厂方法创建的对象,使用的构造函数都是 Object。所以创建的对象都是 Object 这个类型,就导致我们无法区分出多种不同类型的对象。
2.对象字面量
对象的字面量就是一个{}。里面的属性和方法均是键值对:
- 键:相当于属性名。
- 值:相当于属性值,可以是任意类型的值(数字类型、字符串类型、布尔类型,函数类型等)。
使用对象字面量来创建一个对象,非常简洁,举例如下::
let obj2 = {}
对象字面量的属性名可以加引号也可以不加,建议不加。如果要使用一些特殊的名字,则必须加引号。
对象字面量和 json 比较像
JSON:JavaScript Object Notation(JavaScript 对象表示形式)。 JSON 和对象字面量的区别:JSON 的属性必须用双引号引号引起来,对象字面量可以省略。
json 举例:
{
"name" : "zs",
"age" : 18,
"sex" : true,
"sayHi" : function() {
console.log(this.name);
}
};
注:json 里一般放常量、数组、对象等,但很少放 function。
另外,对象和 json 没有长度,json.length 的打印结果是 undefined。于是乎,自然也就不能用 for 循环遍历(因为遍历时需要获取长度 length)。
json 遍历的方法:
json 采用 for...in...
进行遍历,和数组的遍历方式不同。如下:
<script>
const myJson = {
name: 'smyhvae',
aaa: 111,
bbb: 222,
};
//json遍历的方法:for...in...
for (const key in myJson) {
console.log(key); //获取 键
console.log(myJson[key]); //获取 值(第二种属性绑定和获取值的方法)
console.log('------');
}
</script>
3.构造函数创建对象的方式
(1)
obj1['fn'] = function fn1(a, b) {
console.log('我是fn1的函数')
}
console.log(obj1)
(2)
function f(name, age) {
this.name = name
this.age = age
}
const son = new f('张三', 20)
const son2 = new f('王五', 20)
console.log(son)
console.log(son2)
4.Object.create(原型)返回一个新对象
function Person() {}
Person.prototype.lasteName = 'xu'
相当于obj2借用了Person()的原型,复制了一份,让他成为自己的原型
const obj4 = Object.create(Person.prototype)
console.log(obj4)
二.设置对象的属性
1.通过点的形式
obj1.name = 'hy'
obj1.id = 1
console.log(obj1)
2.中括号的方式
obj2['name'] = '小明'
obj2['id'] = 2
console.log(obj2)
区别
比如键名为数字
obj1['0'] = '1'
obj1['0'] = '2'
console.log(obj1)
键名是独一无二的,如果出现一样的键名,那么后则余覆盖前者
obj1."1" = "1";//报错
obj1.1 = "1";//报错
相对来说 []使用更广泛
三、获取对象属性
console.log(obj1.name, obj1.id) . 方式
console.log(obj1['name'], obj1['id']) []方式
获取不存在的属性时
console.log(obj1.aaa) ///undefined
console.log(obj1['aaa']) ///undefined
三、修改对象的属性值
先获取对象属性,再重新赋值
obj1['name'] = 'xiaohong'
console.log(obj1['name'])
修改obj1的fn中函数体 修改前
console.log(obj1['fn'])
obj1['fn']() //我是fn1的函数
修改后
obj1['fn'] = function fn1(a, b) {
console.log('我是修改后的fn1的函数')
}
console.log(obj1['fn'])
obj1['fn']() //我是fn1的函数
console.log(obj1)
四.删除对象的属性
delete 关键词
delete 属性名
console.log(obj1.name) //xiaohong
delete obj1.name
console.log(obj1.name) //undefined