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 {}