面向对象编程

定义

面向对象程序设计(英语:Object Oriented Programming,缩写:OOP)是种具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。它可能包含数据、属性、代码与方法。对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。在面向对象程序编程里,计算机程序会被设计成彼此相关的对象。

注:定义来自维基百科

对象是单个事物的抽象。比如一本书,一个苹果,一只猫都可以是一个对象

对象也是一个容器,封装了属性和方法。比如一只猫的颜色,年龄等是它的属性,吃饭,叫是它的方法

面向对象语言的要求

  1. 封装 - 把相关的信息(无论数据或方法)存储在对象中的能力
  2. 聚集 - 把一个对象存储在另一个对象内的能力
  3. 继承 - 由另一个类(或多个类)得来类的属性和方法的能力
  4. 多态 - 编写能以多种方法运行的函数或方法的能力

创建对象的方法:

通过对象字面量来创建

var student = {
  name: "cinthia",
  age: 19,
  gender: "female",
  sayHello: function() {
    console.log("hi,my name is " + this.name);
  }
};

通过 new Object() 创建对象。

var student = new Object();
(student.name = "cinthia"),
  (student.age = 19),
  (student.gender = "female"),
  (student.sayHello = function() {
    console.log("hi,my name is " + this.name);
  });

通过工厂函数来创建对象。

function createStudent(name, age, gender) {
  var student = new Object();
  student.name = name;
  student.age = age;
  student.gender = gender;
  student.sayHello = function() {
    console.log("hi,my name is " + this.name);
  };
  return student;
}
var s1 = createStudent("cinthia", 19, "female");
var s2 = createStudent("lisa", 19, "female");

通过构造函数来创建对象。

function Student(name, age, gender) {
  this.name = name;
  this.age = age;
  this.gender = gender;
  this.sayHello = function() {
    console.log("hi,my name is " + this.name);
  };
}
var s1 = new Student("cinthia", 19, "female");

构造函数与工厂函数的区别

  • 首先在构造函数内没有创建对象,而是使用 this 关键字,将属性和方法赋给了 this 对象。
  • 构造函数内没有 return语句,this 属性默认下是构造函数的返回值。
  • 函数名使用的是大写的 Student
  • 用 new运算符和类名 Student 创建对象。

每次创建对象,存储在变量中的都是该对象的引用,而不是对象本身

原型

在 JavaScript 中,每一个函数都有一个 prototype属性指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。

<script type="text/javascript">
    function F() {}
    console.log(F.prototype);  //Object,指向另一个对象
</script>
成员 描述
Object.prototype.__ proto __ 指向当对象被实例化的时候,用作原型的对象
Object . prototype . hasOwnProperty() 返回一个布尔值,用来判断-一个属性是定义在对象本身而不是继承自原型链
Object . prototype . isPrototype0f() 返回一个布尔值,示指定的对象是否在本对象的原型链中。
Object. prototype . toString() 返回一个表示该对象的字符串
Object . prototype.value0f() 返回指定对象的原始值

原型链

所有的对象都有原型,而原型也是对象,也就是说原型也有原型,如此下去,也就组成了原型链

属性搜索原则

  • 首先从对象实例本身开始找,如果找到了这个属性或者方法,则返回。
  • 如果对象实例本身没有找到,就从它的原型中去找,如果找到了,则返回。
  • 如果对象实例的原型中也没找到,则从它的原型的原型中去找,如果找到了,则返回。
  • 一直按着原型链查找下去,找到就返回,如果在原型链的末端还没有找到的话,那么如果查找的是属性则返回 undefined,如果查找的是方法则返回 xxx is not a function

原型链继承

利用原型让一个引用类型继承另外一个引用类型的属性和方法

function Student(name, age, gender) {
  this.name = name;
  this.age = age;
  this.gender = gender;
}
Student.prototype.sayHi = function() {
  console.log("hello");
};

var s1 = new Student("cinthia", 19, "female");
s1.sayHello(); // 打印 hello
var s2 = new Student("lisa", 19, "female");
s2.sayHello(); // 打印 hello
//s1、s2都继承了sayHello()的方法

面向对象编程是 JavaScript 编程的一种主流方式,这种方式可以提高代码的易读性,减少代码的冗余,降低代码设计的难度

posted @ 2020-04-20 21:51  齐木子  阅读(635)  评论(0编辑  收藏  举报