JavaScript 构造函数&对象

1. JS数据类型

  在JS中,数据基本可分为两大类:

  第一类:五大基本数据类型:(String、Number、Boolean、Null、Undefined);

  第二类:引用数据类型:对象(Object)

2.对象的分类

  2.1内建对象

    由ES标准定义的对象,在ES的任何实现形式中都能够使用;如常见的Math、String等;

  2.2宿主对象

    由JS运行环境(主要为浏览器)提供的对象,如DOM、BOM;

  2.3自定义对象

    由开发人员自主定义;

3.为何要使用对象?

  在基本数据类型中,值和值之间没有联系,我们所创建的变量都是相互独立的,不能成为一个整体,而对象是一个复合的数据类型,在对象中可以保存多个不同数据类型的属性;

4.函数和构造函数区别?

  构造函数是通过new调用的函数,同函数并无本质的不同,但构造函数习惯上第一个字母大写;声明对象用的Object函数本质就为构造函数;

  构造函数的工作流程:

    1>立刻创建一个对象;

    2>将新建的对象设置为函数中的this,在构造函数中可以使用this来引用新建的对象;

    3>逐行执行函数中的代码;

    4>将新建的对象作为返回值返回;

5.this

  解析器在调用函数时,每次都会向函数中传递一个隐含的参数---this;

  根据函数调用的方式不同,this会指向不同的对象:

    --以函数的形式调用,this永远都是window;

    --以方法形式调用,this就是调用该方法的对象;

    --当以构造函数的形式调用时,this就是新创建的那个对象;

6.对象的创建

6.1使用内置构造函数Object创建一个对象

1 #使用关键字new声明一个对象obj
2 var obj = new Object();

6.2对象的属性

  6.2.1属性的添加

  s即对象中保存的值,可以通过以下方式为对象添加属性

  1> 方式一:「 对象名.属性名 = 属性值 」

 1     //创建一个对象
 2     var obj = new Object();
 3     //向对象中添加一个name属性
 4     obj.name = "张飞";
 5     //向对象中添加一个age属性
 6     obj.age = 38;
 7     //向对象中添加一个gender属性
 8     obj.gender = "男";
 9 
10     console.log(obj);
11 
12 ~~Object{name: "张飞", age: 38, gender: "男"}

  2> 方式2:「 对象名["属性名"] = 属性值 」 

 1 //创建一个对象
 2 var obj = new Object();
 3 //向对象中添加一个name属性
 4 obj['name'] = "张飞";
 5 //向对象中添加一个age属性
 6 obj['age'] = 38;
 7 //向对象中添加一个gender属性
 8 obj['gender'] = "男";
 9 
10 console.log(obj);
11 
12 
13 ~~Object{name: "张飞", age: 38, gender: "男"}

  6.2.2属性值的读取

  同添加属性方式相同,存在两种读取方式:

  1> 方式一: 对象名.属性名

  2> 方式二:对象名["属性名"]

  注:对一些复杂奇怪的属性名,必须通过第二种方式读取:如obj['123']、obj['323423@#']等;同时,第二种读取方式可以存放变量

1 obj['123'] = 456;
2 obj['nihao'] = "你好;
3 
4 var n = 'nihao';
5 
6 console.log(obj[n]);

  6.2.3对象属性值的遍历

  通过for(var i in Object)循环可以遍历出对象中的属性值;

  6.2.4检查对象中是否存在某个属性

  可以通过in运算符console.log('属性值' in 对象名);若存在则为true;

6.3通过对象字面量创建对象

  通过Object构造函数,声明对象,而后为对象添加属性无疑比较复杂,可以直接通过字面量来创建对象;

  语法:{属性名:属性值,属性名:属性值}

    属性名和属性值是成对存在,名和值之间用冒号分割,不同对之间用逗号分开;

1 var obj = {
2         name : "张飞",
3         age: 38,
4         gender : "男";
5         test : {name:"刘备"}
6 };
7 
8 console.log(obj);    

 6.4通过工厂化创建对象

  通过上面的方式创建对象,所占用的代码较多,较复杂,创建多个对象时,冗余的代码较多,因此可以通过使用工厂式方法批量创建对象:

 1 function createPerson(name,age,gender){
 2     //创建一个新的对象
 3     var obj = new Object();
 4     //向对象中添加属性
 5     obj.name = name;
 6     obj.age = age;
 7     obj.gender = gender;
 8     obj.sayName = function (){
 9         console.log(this.name)
10     };
11     //将新的对象返回
12     return obj;
13 }
14 
15 //创建对象的实例
16 var obj1 = createPerson('tom',18,'male');
17 var obj2 = createPerson('jerry',16,'female');
18 console.log(obj1);
19 console.log(obj2);
20 
21 
22 ~~Object {name: "tom", age: 18, gender: "male", sayName: function} 
23 ~~Object {name: "jerry", age: 16, gender: "female", sayName: function} 

  该方法存在的问题:

  使用工厂方法创建的对象使用的构造函数都是Object,所以创建的对象都是Object类,导致我们不能区分多种不同的对象;

6.5使用自定义构造函数创建对象

 1 //创建Person类对象
 2 function Person(name,age,gender){
 3     this.name = name;
 4     this.age = age;
 5     this.gender = gender;
 6     this.sayName = function (){
 7         alert(this.name)
 8     };
 9 }
10 //创建Dog类对象
11 function Dog(){
12 
13 }
14 
15 //创建Person的实例
16 var per1 = new Person('Tom',14,'male');
17 var per2 = new Person("Jerry",18,'female');
18 //创建Dog类的实例
19 var dog1 = new Dog();
20 
21 console.log(per1);
22 console.log(per2);
23 console.log(dog1);
24 
25 ~~  Person {name: "Tom", age: 14, gender: "male", sayName: function} 
26 ~~  Person {name: "Jerry", age: 18, gender: "female", sayName: function} 
27 ~~  Dog {}

 

 

  

    

  

posted @ 2021-12-19 21:44  S_梦痕  阅读(201)  评论(0编辑  收藏  举报