一、面向对象的特性:
【封装--继承--多态】
1、封装
使用对象来封装函数和变量。主要是用来阐述对象中包含的内容。包括属性和方法。
2、继承
一个类获得另一个类的方法和属性。实现代码的重用,(只发生在对象之间)。
继承
js中有三种继承方式
3.1、js原型(prototype)实现继承
prototype 属性使您有能力向对象添加属性和方法。
3.2、构造函数实现继承
3.3、call , apply实现继承
4、多态
相同操作,不同对象表现不同行为。
二、对象创建
1、字面量方式创建对象
var o={
pro_One: '对象',
pro_Two:'123',
Meth: function () {
console.log(this.pro_One);
}
}
o.Meth();
存在的问题: 代码冗余, 当创建多个同类型对象时,有大量重复性代码, 结构性不清晰
2、内置构造函数创建对象
var obj=new Object()
obj.pro_one='对象';
obj.pro_two='123';
obj.mathod= function () {
console.log(this.pro_one);
console.log(this.pro_two); }
obj.mathod()
console.log(obj.mathod);
存在的问题:代码冗余, 创建多个对象,大量重复代码, 复用性不好
3、工厂函数封装创建对象
function createObject_cat(){
var obj=new Object();
obj.pro_one='对象';
obj.pro_two='123';
obj.mathod= function () {
console.log('工厂方式创建一个对象');
};
return obj;
}
var cat_one=createObject_cat();
cat_one.mathod();
4、自定义构造函数创建对象
- 4.1、提供一个构造函数
----4.1.1、在构造函数中:函数可以作为值来传递
function createObject(pro_one,pro_two,demo){
this.pro_one=pro_one;
this.pro_two=pro_two;
this.mathod= demo;
}
var obj1=new createObject('pro1','pro2',function(){console.log('函数作为值传递')});
console.log(obj1.pro_one);
console.log(obj1.pro_two);
obj1.mathod();
console.log(obj1);
- 4.2、 使用“new” +“构造函数”创建对象
---- 4.2.1、使用了new关键字 构造函数的方式创建对象, 系统默认会创建一个新对象
---- 4.2.2、系统默认会将新创建的对象返回 - 4.3、使用“this” 来设置对象的属性和方法
---- 4.3.1将这个新对象赋值给this
function createObject(pro_one,pro_two){
this.pro_one=pro_one;
this.pro_two=pro_two;
this.mathod= function () {
console.log('自定义方式创建一个对象');
};
}
var obj1=new createObject('pro1','pro2');
console.log(obj1.pro_one);
console.log(obj1.pro_two);
obj1.mathod();
console.log(obj1);
返回值的问题:
- 如果返回值是值类型的话,忽略,还是返回系统新创建的对象
- 如果返回值是null,忽略,还是返回系统新创建的对象
- 如果返回值是引用类型,会覆盖系统新创建的对象,返回指定的对象(引用类型);
4.4、instanceof 和constructor属性
----4.4.1、instanceof 判断某个对象是否是指定构造函数创建
console.log(obj1 instanceof createObject); 返回是一个布尔值
----4.4.1、构造器属性constructor 查找对象是由哪个构造函数创建
console.log(obj1.constructor); 返回一个创建对象的构造函数
4.5、返回值的问题:
----4.5.1. 如果返回值值类型,忽略,依旧返回系统对象
----4.5.2. 如果返回值是null,忽略,依旧返回系统对象
----4.5.3. 如果返回值是引用类型(return function{}),引用类型覆盖原对象(返回的匿名函数),
4.6自定义构造函数和工厂函数的区别:
----4.6.1、 自定义构造函数的首字母大写;
----4.6.2、 自定义构造函数通过new 构造函数来创建对象
----4.6.3、 自定义构造函数内部会自动创建新对象,并且赋值给this
----4.6.4、 自动返回新创建对象4.7原型对象
----4.7.1、 构造函数实例化一个对象时,系统默认创建一个和该构造函数绑定对象,这个对象就称为构造函数的原型对象;该对象包含了所有实例共享的属性和·方法,
----4.7.2、原型对象可以存放一些属性和方法,创建出来的对象可以调用原型对象中这些属性和方法通过在构造函数原型对象中添加属性和方法来实现对象间数据的共享
----4.7.3、原型对象的访问(读取),1. 构造函数通过自有的prototype属性来访问原型对象,2. 实例化的对象是通过非标准的.proto属性来访问原型对象的。
----4.7.4、我们根据需要,可以通过(构造函数.prototype) 方法指定新的对象,来作为构造函数的原型对象。但是这个时候有个问题,新的对象的constructor属性则不再指向构造函数。需要手动添加(constructor.构造函数)指回构造函数本身。
----4.7.5、isPrototypeOf:检查某个对象是否是指定对象的原型对象(包含原型链上面的对象)
----4.7.6、约定:
(01). 该对象构造函数的原型对象
(02). 构造函数的原型对象
(03). 构造函数的原型
(04). 对象的原型对象
(05). 对象的原型
这些说法都是一个意思,即: 该对象构造函数的原型对象
三、对象简单操作
1、读取对象属性
- 1.1、读取对象属性时,都会执行一次搜索。首先在该对象中查找该属性,若找到,返回该属性值;否则,到[[prototype]]指向的原型对象中继续查找。
2、增加属性和方法
- 2.1、对象中存在这个属性的话,就是修改,不存在就是添加
3、delete操作符
- 3.1、delete删除实例中的某一个属性,不会对构造函数中申明的属性进行删除,所以也不影响其他的对象属性。
- 3.2、delete删除原型中的某一个属性,会影响到所有引用了原型该属性的对象,返回未定义。
四、原 型链
1、原型链介绍
- 1.1、 所有的对象都是由构造函数创建出来的,即每个对象都有相对应的构造函数
- 1.2、每个构造函数都有一个与之向关联的原型对象
- 1.3、 构造函数的原型对象本身也是对象,因此构造函数的原型对象也有自己的构造函数