JS面向对象编程(OOP)

怼烎@ 2023-05-28 15:46 245阅读 0赞

面向对象编程 OOP

1 面向对象 & 面向过程

面向过程 POP

​ 分析问题所需要的步骤

面向对象OOP

​ 以功能对象划分问题

二者比较:





















面向对象 面向过程
灵活 复用 维护 性能高
性能比面向过程低 没有面向对象灵活、复用、维护

2 类和对象

笔记本    泛指    类
mac笔记本  具体  实例

动物 猫

2.1 面向对象思维特点 :

  1. 抽取对象共用的属性和行为组织成一个类
  2. 对类进行实例化

2.2 对象

​ 属性:事物的特征 名词

​ 方法:事物的行为 动词

2.2.1 创建对象

  1. // 对象直接量
  2. var zs = {
  3. name: 'zhangsan',
  4. age: 18
  5. };
  6. // new Object() 通过构造函数创建 new Array()
  7. var obj = new Object();
  8. console.log(obj);
  9. // 自定义构造函数
  10. function Cat() {
  11. this.color = 'black';
  12. }
  13. var c1 = new Cat(); // 类的实例 根据类创建一个具体对象

3 构造函数与原型

构造函数是一种特殊的函数,主要用来创建对象,总是与new一起
使用(通过new调用)

3.1 new 构造函数

  1. 在内存中创建一个新的空对象 {}
  2. 让函数中的this指向空对象 this === {}
  3. 开始执行函数体 {age: 22, xueli: ‘benke’}
  4. 返回该对象 (构造函数中不需要写return)

    function Girl() {

    1. console.log(this);
    2. this.age = 22;
    3. this.xueli = 'benke';

    }
    var girl1 = new Girl(); // {age: 22, xueli: ‘benke’}
    var girl2 = new Girl();
    console.log(girl1);
    console.log(girl1 === girl2); // false

3.2 构造函数说明

构造函数添加:

1 构造函数内部this添加——实例成员 访问实例成员 对象.成员

2 在构造函数本身添加的成员——静态成员 只能通过构造函数去访问 一般用于创建公共属性

  1. function Student(name, age) {
  2. // name,age叫对象的属性(成员)
  3. this.name = name;
  4. this.age = age;
  5. // study叫对象的方法 (成员)
  6. this.study = function() {
  7. console.log('day day up');
  8. }
  9. }
  10. Student.nation = 'china'; // nation 静态成员 在构造函数本身添加的成员 一般用于定义公共属性
  11. // 创建学生
  12. var zs = new Student('zs', 22); // {name: 'zs', age: 22, study: ...}
  13. var lisi = new Student('lisi', 19);
  14. // 构造函数内部通过this添加的成员 叫实例成员 访问实例成员 对象.成员
  15. console.log(zs.name);
  16. zs.study();
  17. // 访问静态成员 只能通过构造函数去访问
  18. console.log(Student.nation);
  19. console.log(Student.age); // 实例成员不能通过构造函数访问

3.3 原型

3.3.1 原型定义的函数是可共享(将来构造函数的实例都可以共享)

每一个构造函数都有一个prototype属性,指向一个对象,假如该对象定义了属性和方法 这些都会被构造函数拥有。

  1. function Student(name, age) {
  2. // name,age叫对象的属性(成员)
  3. this.name = name;
  4. this.age = age;
  5. /* study叫对象的方法 (成员) this.study = function() { console.log('day day up'); } */
  6. }
  7. // 创建学生
  8. var zs = new Student('zs', 22);
  9. var lisi = new Student('lisi', 19);
  10. /* console.log(zs.study === lisi.study); // false */
  11. //构造函数原型对象
  12. Student.prototype.run = function() {
  13. console.log('running');
  14. }
  15. Student.prototype.study = function() {
  16. console.log('day day up');
  17. }
  18. console.dir(Student.prototype);
  19. zs.run();
  20. lisi.run();
  21. console.log(zs.study === lisi.study); //true
  22. console.log(zs.run === lisi.run); //true

3.3.2 对象属性( __ proto __)

对象都会有一个属性__ proto __(非标准属性,开发不要使用),指向构造函数的prototype原型对象。

  1. function Student(name, age) {
  2. // name,age叫对象的属性(成员)
  3. this.name = name;
  4. this.age = age;
  5. }
  6. // 创建学生
  7. var zs = new Student('zs', 22); //
  8. var lisi = new Student('lisi', 19); //
  9. Student.prototype.run = function() {
  10. console.log('running');
  11. }
  12. Student.prototype.study = function() {
  13. console.log('day day up');
  14. }
  15. zs.run();
  16. // true
  17. console.dir(zs.__proto__ === Student.prototype); // true
  18. console.dir(lisi.__proto__ === Student.prototype); // true
  19. console.log(zs.__proto__ === lisi.__proto__); // true

图解:

在这里插入图片描述

3.3.3 构造函数原型prototype属性 constructor

构造函数原型prototype属性 constructor,它的值指向构造函数。

Student —————-> Student.prototype

Student < —————- Student.prototype.constructor

  1. // 构造函数
  2. function Student(name, age) {
  3. this.name = name;
  4. this.age = age;
  5. }
  6. /* Student.prototype.study = function() { console.log('good good study'); } Student.prototype.run = function() { console.log('running'); } */
  7. Student.prototype = {
  8. constructor: Student, // 千万别忘记,不然会被重新赋值,丢失此属性
  9. study: function() {
  10. console.log('good good study');
  11. },
  12. run: function() {
  13. console.log('running');
  14. }
  15. }
  16. var zs = new Student('zs', 18); // 实例对象
  17. var lisi = new Student('lisi', 22);
  18. zs.study();
  19. zs.run();
  20. console.log(Student.prototype);
  21. /* 原型对象 对象原型 console.log(Student.prototype === zs.__proto__); console.log(Student.prototype.constructor); console.log(zs.constructor === Student); console.log(zs.constructor === zs.__proto__.constructor); console.log(zs.constructor === Student.prototype.constructor); */

3.3.4 原型链

JS成员查找机制-原型链查找机制

当我们访问一个对象的成员(方法或属性) 首先看自己有没有 ,假如没有就查找它的原型(也就是它的__ proto __),假如还没有,查找原型对象的原型(Object的原型对象),依次类推最终,找到Object。

图解:

在这里插入图片描述

推荐

在最后也推荐几篇我认为写得非常好的关于面向对象的文章:

  • Javascript 面向对象编程(一):封装
  • Javascript面向对象编程(二):构造函数的继承
  • Javascript面向对象编程(三):非构造函数的继承

发表评论

表情:
评论列表 (有 0 条评论,245人围观)

还没有评论,来说两句吧...

相关阅读

    相关 面向对象编程OOP

    一.定义 面向对象程序设计(Object Oriented Programming,OOP)是一种计算机编程架构。OOP的一条基本原则是计算机程序由单个能够起到子程序...

    相关 面向对象编程OOP

    面向对象编程(OOP)      Java是一个支持并发、基于类和面向对象和计算机编程语言。如下是面向对象软件开发的优点:         1、代码开发模块化,更容易维

    相关 面向对象编程思想(OOP)

    本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性、七大设计原则和23种设计模式之间的关系。 软件开

    相关 面向对象编程OOP

    一:面向对象编程是java的一个优点:特性:【①封装②继承③多态④抽象】 (1):代码开发模板化.易维护,修改 (2):代码复用 (3):增强代码可靠性,灵活性 (4)