Web前端的知识之旅哟——对象与构造函数与包装类

我们前面已经接触过对象这一种数据,这一篇着重介绍一下对象的有关知识哟~

对象创建方法

对象的创建方法有三种:

1.对象字面量

我们前面的对象创建方法都是使用的字面量的方法创建的。


1. var obj = {};
JavaScript; “复制代码”); “查看纯文本代码”); “返回代码高亮”)

这样的方式就叫做字面量,也是我们创建对象最简单最常用的方法。

对象里面有属性,属性之间用逗号分隔,每一条属性都有属性名和属性值,属性名和属性值之间用分号分隔。

2.构造函数

构造函数也分两种:系统自带的构造函数和我们自定义的构造函数

系统自带的构造函数

创建对象的构造函数是Object()。


1. var obj = new Object();
JavaScript; “复制代码”); “查看纯文本代码”); “返回代码高亮”)

通过这条语句,我们就创建了一个空对象。

它的作用和var obj = {};的作用是一样的。

系统自带的构造函数还有很多,比如Number()、String()、Boolean()、Array()这些都是构造函数。

自定义构造函数

自定义的构造函数是我们平时最常用的一种构造函数

构造函数也是正常的函数,我们为了区分它和别的正常函数,把构造函数的首字母大写。


1. function Person() {}
JavaScript; “复制代码”); “查看纯文本代码”); “返回代码高亮”)

上面就声明了一个构造函数Person。

有了构造函数之后,我们就可以用new操作符来创建对象了。


1. var oPerson = new Person();
2. typeof oPerson; // object
JavaScript; “复制代码”); “查看纯文本代码”); “返回代码高亮”)

这样我们也创建了一个对象oPerson,不过现在这个对象是空对象,因为我们的构造函数什么都没有写,我们也没有给这个对象添加任何属性。

另外,用new操作符创建出来的对象,尽管都是使用的同一个构造函数,但是之间是没有关联的。


1. var person1 = new Person();
2. var person2 = new Person();
3. person1.name = ‘111’;
4. console.log(person2.name); // undefined
JavaScript; “复制代码”); “查看纯文本代码”); “返回代码高亮”)

person1 和 person2 之间没有关系,它们两个是单独的对象。

我们可以在构造函数里面写一些对象天生就有的默认属性。


1. function Person () {
2.       this.name = ‘scarlett’,
3.       this.age = 17
4. }
5. var person = new Person();
6. person.name; // scarlett
JavaScript; “复制代码”); “查看纯文本代码”); “返回代码高亮”)

当然构造函数既然是函数,那么就可以传参数。


1. function Person (name, age) {
2.       this.name = name;
3.       this.age = age;
4. }
5. var person = new Person (‘scarlett’, 18);
6. person.age; // 18
JavaScript; “复制代码”); “查看纯文本代码”); “返回代码高亮”)

创建对象的时候,只有new才会有this

这里有一个重点,为什么我们通过new操作符可以创建互相独立的对象呢

其实,当我们用new操作符的时候,这个new在我们的构造函数里面隐式创建了一个this对象,并且最后返回了这个this对象,这也就是为什么我们通过new可以最后创建一个对象的原因了。


1. function Person (name) {
2.       //var this = {};
3.       this.name = name;
4.       //return this;
5. }
JavaScript; “复制代码”); “查看纯文本代码”); “返回代码高亮”)

如果我们在构造函数首行手动创建一个对象,比如that对象,然后最后返回了that,那么里面的this就没有用了,我么要为属性赋值就要用that了。


1. function Person (name) {
2.       var that = {
3.             name: ‘scarlett’
4.       }; 
5.       that.name = name;
6.       return that;
7. }
8. var person = new Person(‘demo’);
9. person.name; // demo
JavaScript; “复制代码”); “查看纯文本代码”); “返回代码高亮”)

这样默认的name值就是scarlett。

重点:如果我们最后返回的对象,那么this就失效,但是如果最后显示返回的是原始值,那么this还是有效


1. function Person () {
2.       var that = {};
3.       that.name = ‘that’;
4.       this.name = ‘this’;
5.       return 123;
6. }
7. var person = new Person();
8. person.name; // this
JavaScript; “复制代码”); “查看纯文本代码”); “返回代码高亮”)

3.Object.create(原型)

这种方法涉及到原型的知识点了,我们放在后面介绍原型的时候再介绍。

属性的增删改查

其实属性的修改我们前面也都接触过了。

1.


1. var obj = {};
2. obj.name = ‘scarlett’;
3. obj.name; // scarlett
JavaScript; “复制代码”); “查看纯文本代码”); “返回代码高亮”)

我们可以通过对象名+点+属性名的方法来给对象添加新的属性并且赋值。

这个时候如果我们调用obj.age属性的话,这个属性并不存在,但是obj这个对象是存在的,因此浏览器不会报错,只会打印undefined。

2.

修改的操作和增加的操作其实是一样的,只要调用相同的属性名然后赋一个新的值就可以了。


1. var obj = {
2.       name: ‘scarlett’
3. }
4. obj.name = ‘demo’;
5. obj.name; // demo
JavaScript; “复制代码”); “查看纯文本代码”); “返回代码高亮”)

3.

其实我们前面一直都在使用查看属性的功能…

obj.name = ‘demo’;

console.log(obj.name);//demo

这就是查看属性的方法。

4.

删除属性的操作我们需要借助delete操作符,这个操作符的作用就是来删除属性的。


1. var obj = {
2.       name: ‘’scarlett
3. }
4. obj.name; // scarlett
5. delete obj.name;
6. obj.name; // undefined
JavaScript; “复制代码”); “查看纯文本代码”); “返回代码高亮”)

包装类

我们前面提到过,原始值是不可以改变的,只有对象才有属性和方法,那么这个又是个什么东西?


1. var str = ‘abcd’;
2. console.log(str.length); // 4
JavaScript; “复制代码”); “查看纯文本代码”); “返回代码高亮”)

按理说这个字符串原始值是没有属性的,但是这里确实可以查看length这个属性。

这里就涉及到一个叫做包装类的东西了。


1. str.length
JavaScript; “复制代码”); “查看纯文本代码”); “返回代码高亮”)

我们在调用执行这一行代码之前,程序会自动把str包装成一个字符串对象,在这一行代码执行完毕之后再销毁这个字符串对象。


1. var str = ‘abcd’;
2. // var str1 = new String(‘abcd’);
3. str.length; // str1.length
4. // 消除str1
JavaScript; “复制代码”); “查看纯文本代码”); “返回代码高亮”)

这里的str.length的str其实是上一句的包装好的str1,str1是对象,上面有属性和方法,然后就可以打印length属性了,在执行完str.length这行代码之后,str1这个对象就被销毁了。

这也就是为什么我们在执行str.length = 2;这句话之后,再打印str.length;还是4的原因了。


1. var str = ‘abcd’;
2. // var str1 = String(‘abcd’);
3. str.length = 2; // str1.length = 2;
4. //销毁str1
5. console.log(str); // abcd 长度还是4
JavaScript; “复制代码”); “查看纯文本代码”); “返回代码高亮”)

系统在执行str.length = 2这句话的时候,先创建了一个String对象,这个对象的值是‘abcd’,我们改变的length其实是这个隐式创建的对象的length值,并不是改变了我们的原始值str,当str.length = 2;这句代码执行完之后,隐式创建的字符串对象就被销毁了,所以我们后面打印的str.length还是4。


1. var str = ‘abcd’;
2. str.len = 2;
3. console.log(str.len); // undefined
JavaScript; “复制代码”); “查看纯文本代码”); “返回代码高亮”)

其他类型的数据也是一样的,当我们给原始值加属性的时候,都是先隐式包装成对象,然后赋完属性值之后再销毁这个对象。


1. var bool = true;
2. bool.len = 4;
3. console.log(bool.len); // undefined
JavaScript; “复制代码”); “查看纯文本代码”); “返回代码高亮”)

今天的知识点就介绍到这里哟~