关于面向对象的初步了解和自我认识

一:概念

什么是面向对象?--- 面向对象不是一种语法,是一种编程的思想。

1:有面向对象就有面向过程。什么是面向过程呢?

                   面向过程是指如果完成一件事情,那么需要的步骤有哪些,对于这些步骤进行设计规划就是面对完成事情需要的过程,即面向过程。\


2:什么是面向对象呢?首先什么是对象呢?

                  对象:就是客观世界中存在的人、事、物体等实体在计算机逻辑中的映射。既然是一个实体,那么它一定具有一些自身的属性。例如人:一定有的属性是年龄。

 面向对象可以理解为:在完成一件事情中,这件事情必定是由一些人或者物体,他们各自进行了自己的某个动作,这些动作链接起来促成了一件事的完成。那么,我就可以对这些人或这物体进行单独的                  设计规划,让他们执行我设计的动作,然后链接起来构成一件事情的完成,这便是面向对象。此处的人和物体便是对象,他们的动作便是各自的成员方法,他们本身具有的属性便是成员变量。


二:创建对象

*****传统创建对象的方式

1:直接创建:var obj = {} 【字面量创建】

2:构造函数:var obj= new Object()【Object是一个系统提供的构造函数,这个构造函数专门用来创建对象使用的。】

*****工厂函数创建对象

 1 function createObj(name,age,sex){
 2     var obj = new Object();
 3     obj.name = name;
 4     obj.age = age;
 5     obj.sex = sex;
 6     return obj;
 7 }
 8 var obj1 = createObj("张三",12,"男");
 9 var obj2 = createObj("李四",13,"女");
10 var obj3 = createObj("王五",11,"女");

 

缺点:无法精确看到对象类型         解决方案:自定义构造函数。其实相当于自己写一个函数,专门用来new对象。

*****自定义构造函数创建对象

 1 function Person(name,age){        
 2     this.name = name;
 3     this.age = age;
 4     this.sayHi = fn;
 5 }
 6 function fn(){
 7     console.log("我是" + this.name + ",今年" + this.age + "岁");
 8 }
 9 var zs = new Person("张三",12);
10 var ls = new Person("李四",13);

 

---->>>new操作符的作用:1:创建了空对象 ,,,2:将this指向这个空对象,,,3:给this这个对象添加属性,,,4:返回this这个对象

---->>>缺点:不同的对象应该由相同的方法,但是方法在内存中占用了多个空间-浪费

---->>>解决:如果将方法定义在对象外面,可以解决这个问题。代码如下:

 

 1 function Person(name,age){        
 2     this.name = name;
 3     this.age = age;
 4     this.sayHi = fn;
 5 }
 6 function fn(){
 7     console.log("我是" + this.name + ",今年" + this.age + "岁");
 8 }
 9 var zs = new Person("张三",12);
10 var ls = new Person("李四",13);

 

 

 

注意:

但是在后期我们使用插件或者定义别的函数的时候有可能会造成覆盖的现象。所以这个解决方案解决不彻底。

 

使用原型可以完美解决这个问题。

三:原型

1:原型的概念----->>>任何函数在创建好的时候,浏览器会分配一个对象给这个函数,通过函数的prototype可以访问到这个对象。这个对象叫做原型对象,简称原型。通过new构造函数实例化出来的对象默认可以访问到这个对象的属性和方法。

2:原型的基本属性:{任何对象天生自带属性__proto__,指向一个原型对象},{任何函数天生自带属性prototype,指向一个原型对象},{任何一个原型对象天生自带属性constructor,指向构造函数}

3:案例如下:

function Person(){
    
}
Person.prototype.name = '赵六';
Person.prototype.say=function(){
    console.log("说话");
}
var obj1 = new Person();
var obj2 = new Person();
console.log(obj1.say == obj2.say); // true 表示这是同一个内存空间,因为两个对象访问的这个方法是Person这个函数对应的原型对象上的方法,两个对象用的是同一个构造函数Person,所以是相等。这样就能解决上面构造函数的问题了

 

 

4:

我们以后创建对象就使用构造函数,多个对象要使用同一个方法或属性,就把这个属性或方法绑定到原型上。

 

实例对象想访问到原型对象,可以使用__proto__属性。

 

任何对象都有一个属性叫做__proto__ 这个属性可以访问到对应的构造函数的原型对象,也就是构造函数的prototype属性的值

so:将方法添加到构造函数的原型上

 

function Person(name,age){
    this.name = nane;
    this.age = age;
}
Person.prototype.eat = function(){
    console.log("能吃")
}
var p = new Person("张洒",12)
p.eat()

var p1 = new Person("李四",13)
p1.eat()

 

 

 

 

 !!!!构造函数、实例对象、原型对象三者之间的关系如下图:

 

 

四:构造器 

1:概念:每一个原型对象天生带有一个属性叫做constructor,这个属性指的是这个原型对象所属的构造函数。

function Person(){
    
}
var obj1 = new Person();
console.log(obj1.__proto__.constructor === Person); // true  
console.log(obj1.constructor === Person); // true  obj1对象中没有constructor属性,所以去原型对象上找

 

五:原型链

1:原型链的概念:原型对象也是对象,也会有__proto__这个原型对象,这样形成的链式结构

2:原型的作用:访问对象的属性或方法,都是先在自己上找, 自己没有就找原型,原型没有就找原型的原型,....最终会找到null,,,但是对象属性赋值和原型没关系,有就修改,没有就增加。

原型链的几个对象的关系图如下:这样向上的一条链式结构,我们称之为原型链。

 

------>>>所以对于面向对象初步自我认识方可知 :

 

一:面向对象有什么好处?
                      1.容易维护
                      2.效率高
                      3.容易扩展
二:怎样使用面向对象方法呢?
                      1:找到一件事情中所要涉及到的对象,
                      2:找到了对象,就开始为它定义所要用到的属性和要它执行的动作。此处便形成了类。
                      3: 然后通过类,我就可以构造这个对象了,让它拥有我所设计的属性和动作
                      4:最后有了对象,通过调用它的属性和动作完成问题。
                      5:所以面向对象便产生了两个概念:类和对象。

三:那么程序中什么是封装呢?封装的定义是什么?

解:类是一个封装,方法是一个最基本的封装,
定义:封装可以理解为将对象的属性和动作隐藏起来(用函数封装),不直接对外提供访问(但其内部可以直接使用),但另外提供一个接口来间接访问这些属性和动作。
好处:提高代码安全性和复用性,同时隐藏了代码的实现细节,又对外提供访问方便调用者的使用。

四:那么关键字this是什么?
关键字this用于区分同一个类中相同名称的变量,即成员变量和局部变量名称相同时情况,同时被this修饰的变量名称,代表的是当前变量使用的是成员变量。

                                                                                                                                                                                                                                          爱玩代码的软泥博客怪

                                                                                                                                                                                                                                                                                                     2020-07-13

 

posted @ 2020-07-13 17:42  软泥的新时代博客zu  阅读(184)  评论(0)    收藏  举报