1 初识面向对象(面向对象是一种思维方式)
以前写的代码
1 var name = '莉莉'; 2 var sex = '女'; 3 var age = 18; 4 var name1 = '小明'; 5 var sex1 = '男'; 6 var age1 = 19;
面向对象的代码:
1 var lili = { 2 name: 'lili', 3 sex: 'nv', 4 age: 18 5 } 6 var xiaoming = { 7 name: 'xiaoming', 8 sex: 'nan', 9 age: 19 10 }
2 简单工厂
简单工厂:people函数可以产生对象,根据传入的参数不同产生的对象也不同
参数===原料, 对象===产品
1 function people(name, sex, age) { 2 // 声明一个空对象 3 var obj = {}; 4 // 给属性赋值 5 obj.name = name; 6 obj.sex = sex; 7 obj.age = age; 8 // 添加方法 9 obj.show = function() { 10 console.log("我叫" + this.name + ', 我今年' + this.age + '岁,我是一个' + this.sex + '生!'); 11 } 12 // 返回对象 13 return obj; 14 }
简单工厂的缺陷:通过工厂产生的对象,没有办法区分种类
3 构造函数
1、构造函数首字母大写,但这不是语法要求,作为书写习惯
2、构造函数使用new 关键字调用
new操作的过程
1、在内存中申请了一块空间
2、改变this指向(this默认指向window对象,this指向要生成的对象)
3、为this赋值
4、返回this指向的对象
return对构造函数的影响(结论:非引用的返回值没有影响,引用类型的返回值会取代this所指向的对象)
说法:(实例、类、实例化)
将产生的对象称之为实例(实例化对象)
将new过程称之为实例化
将构造函数称之为类
1 <script> 2 function People(name, sex, age) { 3 // 给属性赋值 4 this.name = name; 5 this.sex = sex; 6 this.age = age; 7 // 添加方法 8 this.show = function() { 9 console.log("我叫" + this.name + ', 我今年' + this.age + '岁,我是一个' + this.sex + '生!'); 10 } 11 } 12 var xiaoming = new People('小明', '男', 18); 13 </script>
5 备份this(当指定对象不是this的指定对象 就会默认window对象为指定对象 这时就得备份);
1 <script> 2 var obj = { 3 name1: 'aaa', 4 demo: function() { 5 console.log(this.name1); 6 }, 7 test: function() { 8 // 备份this 9 var me = this; 10 (function() { 11 // 此处this不会指向obj对象,指向的是window对象 12 // console.log(this.name1); 13 console.log(me.name1); 14 })(); 15 } 16 } 17 obj.demo(); 18 // window.name1 = 333; 19 obj.test(); 20 </script>