OOP: 面向对象编程 JS不是一门面向对象的语言,他是基于对象的语言,但是可以模拟面向对象 JS核心是支持面向对象的,同时也提供了OOP语法
什么是对象:万物皆对象,也叫做无序属性集合 ps:简单来说对象是一个容器,封装了属性及方法
什么是面向对象编程(OOP编程): (Object Oriented Programming)OOP是一种编程思想,将真实的复杂关系抽象成一个一个的对象,然后由对象之间分工与合作
**两种编程思想: 1、面向过程:工厂模式 所有事情都要亲历亲为,,面面俱到,有条不絮,注重过程(C语言) 练习-需求:使用函数将对象中相同属性及方法抽离出来,供所有对象使用
function func(name, age, sex){
var obj = {};
obj.name = name;//obj.name是obj的属性, name是形参
obj.age = age;
obj.sex = sex;
obj.fun = function (){
console.log(this.name + '今年' + this.age + '岁.');
}
return obj;
}
var xd = func('熊大', 20, '男');
xd.fun();
var xff = func('熊芬芳', 18, '女');
xff.fun();
工厂模式的优缺点: 优点:可以快速便捷的创建具有相同属性及方法的对象 缺点:会造成不必要的浪费
2、面向对象:构造函数 提出需求,找到合适的对象,让对象完成,从执行者变成指挥者,注重结果(C#)
function Func(name, age, sex){
为创建出来的对象添加属性
this.name = name;//this.name === obj
this.age = age;
this.sex = sex;
this.fun = function (){
console.log(this.name + '今年' + this.age + '岁.');
}
}
创建一个对象实例
var xd = new Func('熊大', 18, '男');
xd.fun();
面向对象-构造函数: 优点:复用性强,当使用new操作符,会自动再函数内创建一个空对象(没有任何属性的对象),那么就可以实现参数互用 构造函数用来做什么? 主要是用来创建自定义对象
new Array() / new Object() / new XMLHttpRequest() /...
构造函数与普通函数: 区别: 1、构造函数个函数名首字母要大写 2、在调用是,构造函数要使用new操作符
使用new和不使用new的区别: 使用new: 1、会创建一个对象实例 2、this会指向创建的对象实例 3、对象默认为return值 不适用new: 1、不会创建对象实例 2、this仍指向window 3、return的值为undefined
构造函数
function Person(){
console.log(this);//没有new之前指向window, new之后指向Person
return;
}
var p1 = new Person();
console.log(p1);
普通函数
function person(){
console.log(this);//window
return;
}
var p2 = person();//比不是调用
console.log(p2);//undefined
new 具体做了什么?
function Ren(firstName, lastName){
this.firstName = firstName;
this.lastName = lastName;
}
var _name = new Ren('Tom', 'Ject');
_name.firstName; // Tom
_name.lastName; // Ject
console.log(_name.__proto__ === Ren.prototype);//true
1、创建一个空的对象 var _name = {}; 或者 var _name = new Object();
2、进行原型连接 _name.proto === Person.prototype; // true 将_name的__proto__连接到Person的原型上,这也是为什么_name.proto === Person.prototype的值为true的原因。
3、改变Person的this指向,让其指向_name var _this = Person.call(_name); //绑定this并执行
4、判断构造函数的返回值 如果是值的类型(基本类型),则丢弃, 如果是引用类型,则替换_name 判断过程:Person函数中没有写return,则默认返回undefined,属于基本类,则丢弃,若return返回的是this,则由第三步改变this指向,返回_name(用Person替换成_name)