什么是对象

1、万物皆对象。
2、对象是单个事物的抽象
3、对象相当于一个容器,封装了属性(property)和方法(method)

  • 属性:对象的状态
  • 方法:对象的行为

什么是面向对象?

面向对象编程,简称OOP,是一种编程开发思想。
可以将真实世界各种复杂的关系,抽象为一个个对象,然后由对象之间的分工与合作对真实世界的模拟。

面向对象与面向过程对比

  • 面向过程就是亲力亲为,事无巨细,面面俱到,步步紧跟,有条不紊;
  • 面向对象就是找一个对象,指挥得到结果;
  • 面向对象是将执行者转换为指挥者;
  • 面向对象不是面向过程的替代,而是面向过程的封装。

可以通 过以下例子来区分面向过程和面向对象:

  1. // 面向过程
  2. // 定义学生对象
  3. var stu1 = {name:"占山",score:95};
  4. var stu2 = {name:"里斯",score:85};
  5. // 封装一个打印学生姓名和成绩的函数
  6. function printscore(student){
  7. console.log("姓名是:" + student.name + "成绩:" + student.score);
  8. }
  9. // 调用函数并打印数据
  10. printscore(stu1);
  11. printscore(stu2);
  12. // 面向对象
  13. // 抽象所有的数据行为生成模板
  14. function studentScroe(name,score){
  15. //实例成员,创建时,直接添加给函数内部的this
  16. this.name = name;
  17. this.score = score;
  18. this.printScore = function(){
  19. console.log("姓名是:" + this.name + "成绩是:" + this.score);
  20. }
  21. }
  22. // 根据模板创建具体实例对象(Instance)
  23. var stu1 = new studentScroe("占山",52);
  24. var stu2 = new studentScroe("里斯",89);
  25. // 调用实例对象自己的方法
  26. stu1.printScore();
  27. stu2.printScore();

面向对象的特性

  • 封装性
  • 继承性
  • 【多态性】抽象

    面向对象的设计思想

  • 抽象出Class(构造函数)

  • 根据Class(构造函数)创建Instance(实例)
  • 指挥Instance得出结果

    创建对象的几种方式

  • new Object() 构造函数

  • 对象字面量
  • 工厂函数
  • 自定义构造函数

不太清楚的可以参考下面的链接复习一下:
Iknnm:Js对象

构造函数和实例对象的关系

构造函数会根据具体的事物抽象出来的抽象模板
实例对象是根据抽象的构造函数模板得到具体实例对象

静态成员和实例成员

我们在使用构造函数方法创建对象时,可以给构造函数和创建的实例对象添加属性和方法,而这些属性和方法都叫做成员。
实例成员:在构造函数内部添加给this的成员,属于实例对象成员,在创建实例对象后必须由对象调用。
静态成员:添加给构造函数自身的成员,只能使用构造函数进行调用,不能使用生成的实例对象调用。

  1. function Person(name,age){
  2. // 实例成员,通过将来生成的实例对象进行调用的成员
  3. // 创建时,是直接添加给函数内部的this
  4. this.name = name;
  5. this.age = age;
  6. this.sayName = function(){
  7. console.log(this.name);
  8. }
  9. }
  10. // 静态成员--直接给构造函数添加的成员
  11. Person.version = "1.0";
  12. //生成对象实例
  13. var p1 = new Person("Bob",23);
  14. var p2 = new Person("Mike",19);
  15. // 调用实例成员
  16. console.log(p1.name);
  17. // 调用静态成员,只能通过构造函数进行调用
  18. console.log(Person.version);

构造函数存在问题的解决方法

1、在构造函数中,直接定义函数,内存浪费的问题

  1. // 自定义构造函数
  2. function Person(name,age){
  3. this.name = name;
  4. this.age = age;
  5. // 每个对象的sayName方法是一一样的
  6. this.sayName = function(){
  7. console.log(this.name);
  8. }
  9. }
  10. // 生成对象实例
  11. var p1 = new Person("张三",23);
  12. var p2 = new Person("里斯",18);
  13. // 判断各自的方法是否是同一个函数
  14. console.log(p1.sayName == p2.sayName); //false

处理方法一:可以将自定义构造函数内部的sayName方法单独放到一个函数里。

  1. // 解决方法一:提取公共函数
  2. function sayName(){
  3. console.log(this.name);
  4. }
  5. // 自定义构造函数
  6. function Person(name,age){
  7. this.name = name;
  8. this.age = age;
  9. // 每个对象的sayName方法是一一样的
  10. this.sayName = sayName;
  11. }
  12. // 生成对象实例
  13. var p1 = new Person("张三",23);
  14. var p2 = new Person("里斯",18);
  15. // 判断各自的方法是否是同一个函数
  16. console.log(p1.sayName == p2.sayName); //true

处理方法二:如果存在多个函数,可能会导致命名重复,就可以将函数放到一个对象中

  1. // 解决方法二:如果存在多个函数,可能会导致命名重复,就可以将函数放到一个对象中
  2. var fun = {
  3. sayName : function(){
  4. console.log(this.name);
  5. },
  6. sayAge : function(){
  7. console.log(this.age);
  8. }
  9. }
  10. // 自定义构造函数
  11. function Person(name,age){
  12. this.name = name;
  13. this.age = age;
  14. // 每个对象的sayName方法是一一样的
  15. this.sayName = fun.sayName;
  16. this.sayName = fun.sayAge;
  17. }
  18. // 生成对象实例
  19. var p1 = new Person("张三",23);
  20. var p2 = new Person("里斯",18);
  21. // 判断各自的方法是否是同一个函数
  22. console.log(p1.sayName == p2.sayName); //true
  23. console.log(p1.sayAge == p2.sayAge); //true

处理方法三、使用原型对象创建sayAge

  1. // 自定义构造函数
  2. function Person(name,age){
  3. this.name = name;
  4. this.age= age;
  5. // 使用原型对象创建sayAge
  6. // Person.prototype 得到的就是一个原型对象
  7. Person.prototype.sayAge = function(){
  8. console.log(this.name);
  9. }
  10. }
  11. //定义实例对象
  12. var p1 = new Person("张三",26);
  13. var p2 = new Person("张三",26);
  14. // 打印
  15. p1.sayAge();//张三
  16. console.log(p1.sayAge == p2.sayAge);//true

总结:

面向对象编程具有灵活性、代码可复用性、高度模块化等特点,容易维护维护和开发。适合于多人合作的大型软件项目。