关于面向对象的初步了解和自我认识
什么是面向对象?--- 面向对象不是一种语法,是一种编程的思想。
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:概念:
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

浙公网安备 33010602011771号