JavaScript学习笔记---面向对象
## 面向对象 面向过程 类
## 对象 【键值对,属性名,属性值】
## 创建对象
## 1.字面量创建对象 根据特征
var obj = {
name:'aa',
fn:function(){}
}
console.log(obj.name);
obj.fn();
缺点: 不适合创建大量对象,会造成代码冗余
## 2.实例创建对象 根据关键字
var obj = new Object(); ==> 相当于 var obj = {}
obj.属性名 = 属性值;
obj.方法名 = function(){}
缺点: 不适合创建大量对象,会造成代码冗余
## 3.工厂模式 【封装实例创建方法,并且记得return】
function 函数名(a){
var obj = new Object(); 准备原材料
obj.属性名 = a; 加工
obj.方法名 = function(){}
return obj; 推出工厂,走向世界
}
instancof检测来源
console.log(n1 instanceof 工厂模式函数名); false
console.log(n1 instanceof Object); true
缺点: 用instanceof检测发现无法识别具体来源
## 4.构造函数式创建对象
构造函数特点:
1.函数名首字母大写【不是必须,是约定】
2.this来赋值 【重点】
3.实例化时需要加new 【重点之重点】
4.用this赋值时,无需return
function Abc(a,num){ // 函数名首字母大写
this.name = a; // 用this赋值
this.age = num;
this.fn = function(){
}
}
var n1 = new Abc('Alice',19); // 实例化构造函数时 加 new ************
console.log(n1 instanceof Abc); // true 可以识别来源
缺点: 实例化对象时,会重新创建该对象中的方法,造成内存浪费
## 5.原型创建对象
原型:prototype 【只有函数有】
属性:__proto__ 【大范畴对象都有】
原型链:一种指向关系。该对象的__proto__属性,指向了它的构造函数的原型。最终指向指向空(null)。
function Fn(a){ // 构造函数
this.name = a;
}
// 在构造函数的原型上添加属性和方法,并且他们是共享的。
Fn.prototype.age = 10;
Fn.prototype.fun = function(){
console.log(11111)
}
var s1 = new Fn('Ann'); // {}
var s2 = new Fn('Bob');
console.log(s1.fun == s2.fun); // true
注: 构造函数prototype【原型】上的属性和方法是共享的。
缺点: 不能传参
## 混合开发 【构造函数+原型创建】
构造函数 中 放私有
原型方法 中 放公共
## 改变this指向 功能完全一致,传参方式不同
1.call
函数名.call(新指向,实参1,实参2......)
2.apply
函数名.apply(新指向,[参数1,参数2])
3.bind
var 变量名 = 函数名.bind(新指向,参数1,参数2......)
变量名();
## 面向对象继承
1.原型链继承
单向 【构造函数体内的私有方法和 构造函数原型上的公共方法 都能被继承】
function A(){}
function B(){}
2.对象冒充继承
单向 【只能继承构造函数上的私有方法 不能继承 该构造函数 原型上的属性和方法】