面向对象的概念:
- 两种编程思路: 函数式(过程式)、面向对象(OOP)
- 类 : 具有相同的属性和方法的一类对象的抽象
- 实例 :某一类当中的一个对象
- 对象: 具有属性和方法的具体的事物
面向对象的创建:
- 普通模式——每次创建对象都要设置一遍属性,属性相同时,代码冗余;
``` var girl1 = { name: '如花', age: 18, sex: '女' ; var girl3 = new Object(); girl3.name = '春花'; girl3.age = 19; girl3.sex = '女'; ```
- 工厂模式——把创建对象和返回对象的功能封装在函数中,减少代码冗余,没有类的概念;
``` function girl(name, age, sex) { var obj = new Object(); /* 创建对象 */ obj.name = name; obj.age = age; obj.sex = sex; return obj; /* 返回对象 */ } var g1 = girl('如花', 18, '女'); console.log(g1); var g2 = girl('似玉', 18, '女'); console.log(g2); console.log(g1 instanceof girl); //false ```
- 构造函数模式——有类的概念,创建出来的实例是属于同一类,使用 instanceof 运算符可以检测出来,所有的属性和方法都是实例私有的;
- 1)-构造函数函数名首字母大写(规律) - 2)-用new 方式执行,new操作符会自动创建并返回对象,这个对象称之为这个类的实例 - 3)-构造函数里面的this指向当前实例 ``` function Girl(name, age, sex) { //自动创建对象 this.name = name; this.age = age; this.sex = sex; //自动返回对象 } var g1 = new Girl('如花', 18, '女'); var g2 = new Girl('似玉', 18, '女'); // Girl('如花', 18, '女'); //如果用普通函数方式执行,里面this指向window // console.log(window); ```
- 原型
- 所有对象天生自带一个属性 `__proto__`, 指向的是其构造函数的原型 - 所有的函数天生自带一个属性 `prototype`(原型)
- 原型+构造函数模式——即可以实现私有属性,也可以实现共有方法
``` function Girl(name, age, sex, str) { //自动创建对象 this.name = name; this.age = age; this.sex = sex; this.str = str; //自动返回对象 } Girl.prototype.chat = function () { // 公有方法里面的this指向当前调用它的实例 console.log(this.str + 'hahaha'); } var g1 = new Girl('如花', 18, '女', 'hello world'); g1.chat(); ```
- 动态混合模式——把共有方法放在构造函数里边
``` /* 动态混合模式 */ function Girl(name, age, str) { this.name = name; this.age = age; this.str = str; if (typeof chat != 'function') { //如果不存在chat方法,就添加 Girl.prototype.chat = function () { console.log(this.str); } } } var g1 = new Girl('小红', 18, 'hello world'); ```
this的指向:
- 在普通函数中,没有对象调用,this指向window;
- 在对象方法中,this指向调用它的对象;
- 在事件处理函数中,this指向触发事件的元素;