16.什么是面向对象编程?
面相对象编程
什么是面向对象???
面向对象 英文Object Oriented,缩写OO
面向对象是一种软件开发方法,它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的灵活性、重用性和扩展性。
面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物,是一种高级的编程思想。
面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。
面向对象的三大特征:抽象、继承、多态、封装
抽象:
抽象是指强调实体的本质、内在的属性。在系统开发中,抽象指的是在决定如何实现对象之前的对象的意义和行为。使用抽象可以尽可能避免过早考虑一些细节。
继承:
继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
多态:
多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。
类与对象
类描述了一组有相同特性和相同行为的对象,具有相同属性和相同方法的对象的抽象就是类。
类的实例是对象
对象把数据及对数据的操作方法放在一起,作为一个相互依存的整体。
对象的抽象是类
类与对象的关系:模板 -> 产品
“JavaScript中所有事物都是对象”,如 字符串、数组、函数…等等。
因为所有事物均继承自Object,都是Object的实例。
对象是带有属性和方法的集合。
变量和属性:
变量是自由的,属性是属于对象的,是与对象相关的值。
函数和方法:
函数是自由的,方法是属于对象的,是与对象相关的函数。
var a =‘qwe’; // 变量
alert( a );
var obj = {}; // 对象
obj.name = ‘xiaocuo’; // 属性
obj.age = 25; // 属性
obj.sayHi = function (){ // 方法
alert(‘hi,大家好!');
}
alert( obj.name );
obj.sayHi();
创建对象
ECMAScript提供了多个原生对象,如 Object、Array、String、Boolean、Number、Date…等等。
此外,JavaScript允许自定义创建对象。
创建对象有多种不同的方法:
1.Object构造函数
2.对象字面量
3.工厂模式
4.构造函数
5.原型模式
6.混合模式
……
Object构造函数
var obj1 = new Object();
obj1.name = ‘xiaocuo’;
obj1.age = 25;
obj1.sayHi = function (){
alert(‘hi,大家好!我叫’ + obj1.name);
}
或者:
var obj2 = {};
obj2.name = ‘laowang’;
obj2.age = 35;
obj2.sayHi = function (){
alert(‘hi,大家好!我叫’ + obj2.name);
}
对象字面量
var obj3 = {
name: ‘laozhao’,
age: 23,
sayHi: function (){
alert(‘hi,大家好!我叫’ + obj3.name);
}
}
1 和 2 的缺陷:创建多个对象时,会产生大量的重复代码!
工厂模式
工厂模式是软件工程领域一种常见的设计模式,这种模式抽象了创建对象的具体过程。
原料 => 加工 => 出厂
用函数来封装创建对象的具体过程:
function createObj( n, a ){
// 原料
var obj = {};
// 加工
obj.name = n;
obj.age = a;
obj.sayHi = function (){
alert(‘hi,大家好!我叫’ + obj.name);
}
// 出厂
return obj;
}
var obj1 = createObj(‘小王’, 23);
var obj2 = createObj(‘小李’, 24);
console.log( obj1.sayHi === obj2.sayHi ); // false
console.log( obj1.constructor ); // Object
对象的 constructor 属性,返回对象的构造器(类)
工厂模式的缺陷:
工厂模式创建多个对象时,不同对象的相同方法仍然存在多个,既不环保,又不高效;
工厂模式创建对象时,没办法解决对象类型识别的问题。
构造函数
当任意一个普通函数用于创建一类对象,并且通过new操作符来调用时,它就可以作为构造函数
作用:构造新对象,设置对象的属性和方法
ECMAScript提供了多个内置构造函数,如 Object、Array、String、Boolean、Number、Date…等等。
var obj = new Object();
var arr = new Array();
ECMAScript允许自定义构造函数
按照惯例,构造函数通常以一个大写字母开头!
实现:在函数内部给this添加属性和方法,因为this就表示当前运行时的对象。
function Human( n, a ){ // 构造函数 类
this.name = n;
this.age = a;
this.sayHi = function (){
alert(‘hi,大家好!我叫’ + this.name);
}
}
var obj1 = new Human(‘张三’, 18);
var obj2 = new Human(‘李四’, 19);
构造函数 => JS内置的工厂模式
function Human( n, a ){ // 构造函数
// var this = {};
this.name = n;
this.age = a;
this.sayHi = function (){
alert(‘hi,大家好!我叫’ + this.name);
}
// return this;
}
var obj1 = new Human(‘张三’, 18);
var obj2 = new Human(‘李四’, 19);
function Human( ){ // 构造函数
console.log( this ); // Human{ }
}
var obj1 = new Human();
console.log( obj1 ); // Human{ }
console.log( obj1.sayHi === obj2.sayHi ); // false
console.log( obj1.constructor ); // Human
对象的 constructor 属性返回该对象的构造函数(类)
构造函数的缺陷:
解决了对象类型识别的问题,但是创建多个对象时,不同对象的相同方法仍然存在多个!
原型模式
每个函数都有一个prototype(原型)属性,这个属性指向一个对象,即原型对象
prototype的作用是:所有添加到prototype中的属性和方法都将被所有对象实例共享。
function Cat(){ };
Cat.prototype.name =‘小白’;
Cat.prototype.color =‘white’;
Cat.prototype.food =‘fish’;
Cat.prototype.skill = function (){
alert(‘卖萌~喵喵喵~~~’);
};
var cat1 = new Cat();//实例
var cat2 = new Cat();//实例
alert(cat1.skill === cat2.skill);//true
alert(cat1.name === cat2.name);//true
原型模式的问题:
原型模式省略了为构造函数传递参数这一环节,结果所有实例都将取得相同的属性值。
prototype中的属性和方法共享,对于函数来说非常适合,但属性共享问题就严重了!
Object.prototype.abc = '123';
var str = 'qwe';
var arr = [4,5,6];
var bool = true;
var fun = function () {};
console.log(str.abc);
console.log(arr.abc);
console.log(bool.abc);
console.log(fun.abc);
混合模式
混合使用构造函数模式和原型模式,是目前JS中使用最广泛、认同度最高的一种创建对象的方法
构造函数模式用于定义实例属性,原型模式用于定义共享的属性和方法
即可以共享方法,又可以向构造函数传递参数,集两种模式之长!
function Person(n,s,a){
this.name = n;
this.sex = s;
this.age = a;
}
Person.prototype.attr = '人类';
Person.prototype.eat = function (){
alert('什么都吃');
}
var p1 = new Person('老王','男',36);
var p2 = new Person('小宋','女',26);
console.log(p1.constructor);//Person
console.log(p1.eat === p2.eat);//true
面向对象与面向过程的区别
面向过程是一种直接的的编程方法,它是按照编程的思路考虑问题,通过顺序执行一组语句来实现一个功能。
面向过程可以说是从细节方面考虑问题
面向对象可以说是从宏观方面考虑问题
面向过程 ==> ‘自己造电脑'
面向对象 ==> ‘自己组装电脑’
小结:
面向对象 目标 => 对一个对象进行编程
构造函数 作用 => 提供一个对象供你编程
通过构造函数实现面向对象编程
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)