~~我的理解:
面向对象是从面向过程思想的基础上延伸出来的新思想,这一思想的出现说明人们对计算机的认知又上升了一个层次,面向对象思想的目的是:让计算机存储人类的行为以及该行为所需要的数据,当人类需要做这件事会用到这个行为则会以计算机理解的方式去调用这个行为,而且这个行为具有可复制性并且这个行为会不断的更新和迭代来满足当下的行为需求(所以我的理解是真正的让计算机有生命------是不断地对计算机软硬件的更新和迭代,当你不再维护你写的类 ,那么你写的类的生命就结束了)。
面向过程我可以用一句话来概括:“牵一发而动全身”。只要涉及到改业务 修改页面的个数实际上不能确定(几十,甚至上百 ) ,枯燥而乏味。
~~我学习的专业知识:
面向对象特性
1.封装:将方法、属性等内容集中放入到指定的位置(一对大括号里 块级作用域或函数作用域)。
2.继承:子类可以继承(访问、调用)父类的属性和方法,如果没有父类则默认继承Object类。
(1)继承方式:
a.原型链继承: 一个引用类型 继承另一个引用类型 缺点是不能传参。
b.构造函数继承: 也叫借用构造函数 在子类中让this指向父类(另一个类)进而调用其属性和方法,缺点:父类的原型方法不会被子类继承。
c.组合继承: 构造继承和原型链继承的组合 扬长避短。
3.多态(多种状态):父类中定义的方法子类中仍然可以定义(只是定义的内容不同,方法名是相同的)。
语法结构:
//ES5 -- ~~方法套方法
//(1)封装
function Person(){
this.p1 = 1;
this.fp1 = function(){
return this.p1;
}
}
function Student(){
this.s1 = 1;
this.fs1 = function(){
return this.s1;
}
}
Student.prototype.adds1 = function(){
return '原型链上添加方法';
}
var stu = new Student();
console.log(stu.s1); //1
console.log(stu.fs1());//1
stu.adds1();// '原型链添加方法'
//(2)继承 的写法
//a.****************************构造函数继承*************************
function Person(){
this.p1 = 1;
this.fp1 = function(){
return this.p1;
}
}
function Student(){
this.s1 = 1;
this.fs1 = function(){
return this.s1;
}
Person.call(this);
this.fs2 = function(){
return this.p1;
}
}
var stu = new Student();
stu.fs2();//1
//b.*******************************原型链继承**************************
function Person(){
this.p1 = 1;
this.fp1 = function(){
return this.p1;
}
}
function Student(){
this.s1 = 1;
this.fs1 = function(){
return this.s1;
}
}
Student.prototype = new Person();
Student.prototype.p1 = 2;
var stu = new Student();
console.log(stu.p1);//2
//c.*****************************组合继承******************************
function Person(name){
this.p1 = name;
this.fp1 = function(){
return this.p1;
}
}
Person.prototype.getp1 = function(){return this.p1};
function Student(name){
this.s1 = 1;
this.fs1 = function(){
return this.s1;
}
Person.call(this,name);
}
Student.prototype = new Person();
//(3)多态
//对象字面量
var obj = {
key_1: "value_1",
arr: [1, 2, 3],
fun: fun,
};
function fun() {
return "你好";
}
console.log("obj.key_1 :>> ", obj.key_1); //value_1
console.log("obj.arr :>> ", obj.arr.join("-")); //1-2-3
console.log("obj.fun :>> ", obj.fun());//你好
//Object
var obj = new Object();
console.log('obj :>> ', obj);
//ES6封装一个类 declared
class Person{ //定义一个类
constructor(name='ppp'){
this.name= name;
}
}
//ES6类的继承
class Student extends Person{
constructor(name='sss'){
super(name);//如果出现extends继承关键字 则super放在构造函数第一行
this.name= name;
}
//console.log(实例对象名.attr);//mkttt
get attr(){ // 属性
return 'mk' + this.name;
}
//实例对象名.attr = 'ssssss';
set attr(value){
this.name = value;
}
// 静态方法:通过类名调用 Student.say('静态方法');
static say(name){
console.log(name);
}
}
Student.staAttr= 't'; // 定义静态属性
let stu = new Student('ttt');
面向对象的优势
增强了代码的扩展性和复用性、高内聚低耦合
遍历对象
for…in //遍历对象属性名 通过对象属性名来访问属性值
![](https://img-blog.csdnimg.cn/e0f6ad0a13bd4029b24c4e80b080c067.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5rOi5qyh5Zia,size_20,color_FFFFFF,t_70,g_se,x_16)
for…of //直接遍历对象属性值
***~~obj不是迭代器 ***
***~~json数组可以使用 for…of ***
![](https://img-blog.csdnimg.cn/ef6974518e1c42069e9fe330ff8ba16e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5rOi5qyh5Zia,size_17,color_FFFFFF,t_70,g_se,x_16)
对象转字符串
![](https://img-blog.csdnimg.cn/d94681645f054529974ca75492510f6f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5rOi5qyh5Zia,size_17,color_FFFFFF,t_70,g_se,x_16)
深拷贝对象
this
this关键字 也叫调用上下文,
绑定方式:
1.默认绑定:作为普通函数被调用,函数内的this指向window对象,但是在严格模式下this指undefined,但是严格模式下匿名箭头函数自调用还是指向window对象。
2.隐式绑定:当用创建对象的变量调用对象内的属性和方法,this指向该对象。
![](https://img-blog.csdnimg.cn/cdccb1165cfc443db32ff5025e4c686c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5rOi5qyh5Zia,size_20,color_FFFFFF,t_70,g_se,x_16)
apply和call会立即执行被调用的函数,apply第二个参数是数组(被调用函数的参数列表),call第二个参数以及第n个参数 就是参数列表。
bind会返回一个新方法 用于后面调用。
~传入null 或 undefined 则指向 window。
~传入原始类型的值 会自动转化为对应的包装对象。
![](https://img-blog.csdnimg.cn/28242c3fa1ea4445bdf363616017389b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5rOi5qyh5Zia,size_15,color_FFFFFF,t_70,g_se,x_16)
4.构造函数绑定–过new关键字绑定:对象字面量不能直接new–因为它本身并不是方法也没有构造函数。
![](https://img-blog.csdnimg.cn/27856916cb7c4ef183a995dd8c48cfc5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5rOi5qyh5Zia,size_17,color_FFFFFF,t_70,g_se,x_16)
设计模式
1.单例模式:只能有一个实例、不存在就创建,存在就用这个实例。
2.工厂模式:写一个方法专门创建对象。
3.观察者模式:设置一个哨兵 观察值的变化 然后改变其它的值…
4.订阅模式:发布者改变数据 中间的订阅者收到消息 改变数据。
参考:《前端程序员面试笔试宝典》
参考:b站 【胡哥前端】 ~~感谢分享
https://www.bilibili.com/video/BV1vZ4y1r78w?from=search&seid=1202679965781306061&spm_id_from=333.337.0.0