09 (H5*) JS第7天 原型

目录

1:创建对象的3中方式

2:工厂模式创建实例对象

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

4:构造函数创建对象带来的问题--原型

5:原型中创建方法

6:构造函数、原型对象、实例对象的关系

7:原型对象的简单写法--必须手动添加构造器

8:实例对象访问属性和方法

 

 

1:创建对象的3中方式

 <script>
    //对象:特指的某个事物,具有属性和方法(一组无序的属性的集合)
    //特征---->属性
    //行为---->方法
    //小苏:------>姓名,性别,年龄,吃,睡觉,玩
    
    //创建对象三种方式:
    
    //1  字面量的方式
    //2  调用系统的构造函数
    //3  自定义构造函数方式
    
    // 1:  实例对象
   var per1={
     name:"卡卡西",
     age:20,
     sex:"",
     eat:function () {
       console.log("吃臭豆腐");
     },
     readBook:function () {
       console.log("亲热天堂");
     }
   };

    // 2:  调用系统的构造函数
    var per2=new Object();
    per2.name="大蛇丸";
    per2.age=30;
    per2.sex="";
    per2.eat=function () {
      console.log("吃榴莲");
    };
    per2.play=function () {
      console.log("这个小蛇真好玩");
    };

    console.log(per2 instanceof Object);


    // 3:  自定义构造函数
    function Person(name,age,sex) {
      this.name=name;
      this.age=age;
      this.sex=sex;
      this.play=function () {
        console.log("天天打游戏");
      };
    }
    var per=new Person("雏田",18,"");
    console.log(per instanceof Person);
  </script>

 

 

2:工厂模式创建对象

<script>
    
    function createObject(name,age) {
      var obj=new Object();
      obj.name=name;
      obj.age=age;
      obj.sayHi=function () {
        console.log("您好");
      };
      return obj;
    }
    function Person(name,age) {
      this.name=name;
      this.age=age;
      this.sayHi=function () {
        console.log("您好");
      };
    }
    //创建对象---->实例化一个对象,的同时对属性进行初始化

    /*
    * 共同点:都是函数,都可以创建对象,都可以传入参数
    *
    * 工厂模式:
    * 函数名是小写
    * 有new,
    * 有返回值
    * new之后的对象是当前的对象
    * 直接调用函数就可以创建对象
    *
    * 自定义构造函数:
    * 函数名是大写(首字母)
    * 没有new
    * 没有返回值
    * this是当前的对象
    * 通过new的方式来创建对象
    *
    *
    * */


    var per1=new Person("小红",20);

    var per2=createObject("小明",20);
  </script>

 

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

实例对象是通过构造函数创建的

 <script>
    //面向对象的思想是----抽象的过程---->实例化的过程

    //小苏这个人,姓名,年龄,性别, 吃饭,打招呼,睡觉

    //自定义构造函数----->实例化对象
    function Person(name,age,sex) {
      this.name=name;
      this.age=age;
      this.sex=sex;
      this.eat=function () {
        console.log("吃大蒜拌臭豆腐加榴莲酱");
      };
    }
    //构造函数---->创建对象
    var per=new Person("小苏",38,"");
    per.eat();//
    
    //实例对象是通过构造函数来创建
    //实例对象会指向自己的构造函数(暂时理解,是错误的)
    //把这个对象的结构显示出来
    console.dir(per);
    console.dir(Person);


    //实例对象的构造器(构造函数)
    //实例对象的构造器是指向Person的,结果是true,所以,这个实例对象per就是通过Person来创建的
    console.log(per.constructor==Person);//

    console.log(per.__proto__.constructor==Person);
    console.log(per.__proto__.constructor==Person.prototype.constructor);



    //构造函数
    function Animal(name) {
      this.name=name;
    }
    //实例对象
    var dog=new Animal("大黄");
    console.dir(dog);//实例对象
    console.dir(Animal);//构造函数的名字

    console.log(dog.__proto__.constructor==Person);
    console.log(dog.__proto__.constructor==Animal);


    //判断这个对象是不是这种数据类型
    console.log(dog.constructor==Animal);

    console.log(dog instanceof Person);



    //总结:
    /*
    * 实例对象和构造函数之间的关系:
    * 1. 实例对象是通过构造函数来创建的---创建的过程叫实例化
    * 2.如何判断对象是不是这个数据类型?
    *  1) 通过构造器的方式 实例对象.构造器==构造函数名字
    *  2) 对象 instanceof 构造函数名字
    *  尽可能的使用第二种方式来识别,为什么?原型讲完再说
    *
    *
    *
    * */

  </script>

 

 

4:构造函数创建对象的问题

<script>
   function Person(name,age) {
     this.name=name;
     this.age=age;
     this.eat=function () {
       console.log("今天吃红烧土豆");
     }
   }
   var per1=new Person("小白",20);
   var per2=new Person("小黑",30);

   console.dir(per1);
   console.dir(per2);

   
   per1.eat();
   per2.eat();
   //不是同一个方法
   console.log(per1.eat==per2.eat);


    function myEat() {
    console.log("吃大榴莲");
    }
    var myEat=10;
    function Person(name,age) {
        this.name=name;
        this.age=age;
        this.eat=myEat;
    }
    var per1=new Person("小白",20);
    var per2=new Person("小黑",30);

    console.dir(per1);
    console.dir(per2);
    console.log(per1.eat==per2.eat);
    //通过原型来解决---------数据共享,节省内存空间,作用之一

  </script>

 

 

5:原型中创建方法

<script>
    function Person(name,age) {
      this.name=name;
      this.age=age;
    }
    //通过原型来添加方法,解决数据共享,节省内存空间
    Person.prototype.eat=function () {
      console.log("吃凉菜");
    };

    var p1=new Person("小明",20);
    var p2=new Person("小红",30);
    console.log(p1.eat==p2.eat);//true

    console.dir(p1);
    console.dir(p2);

    //实例对象中根本没有eat方法,但是能够使用,这是为什么?
  </script>

 

 

6:构造函数、原型对象、实例对象之间的关系

   * 构造函数可以实例化对象
   * 构造函数中有一个属性叫prototype,是构造函数的原型对象
   * 构造函数的原型对象(prototype)中有一个constructor构造器,这个构造器指向的就是自己所在的原型对象所在的构造函数
   * 实例对象的原型对象(__proto__)指向的是该构造函数的原型对象
   * 构造函数的原型对象(prototype)中的方法是可以被实例对象直接访问的

 

 

 

7:原型对象的简单写法--必须手动添加构造器

  <script>
    function Student(name, age, sex) {
      this.name = name;
      this.age = age;
      this.sex = sex;
    }
    //简单的原型写法
    Student.prototype = {
      //手动修改构造器的指向
      constructor:Student,
      height: "188",
      weight: "55kg",
      study: function () {
        console.log("学习好开心啊");
      },
      eat: function () {
        console.log("我要吃好吃的");
      }
    };

    var stu=new Student("段飞",20,"");
    stu.eat();
    stu.study();
    console.dir(Student);
    console.dir(stu);

  </script>

 

 

8:实例对象访问属性和方法

  <script>
    function Person(age,sex) {
      this.age=age;//年龄
      this.sex=sex;
      this.eat=function () {
        console.log("构造函数中的吃");
      };
    }
    Person.prototype.sex="";
    Person.prototype.eat=function () {
      console.log("原型对象中的吃");
    };


    var per=new Person(20,"");
    console.log(per.sex);//
    per.eat();

    // console.log(per.height);//男
    // per.play();

    console.dir(per);


    /*
    * 实例对象使用的属性或者方法,先在实例中查找,找到了则直接使用,找不到则,去实例对象的__proto__指向的原型对象prototype中找,找到了则使用
    *  找不到属性:undefined
    *  找不到方法: 报错 Uncaught TypeError: per.play is not a function
    * */


  </script>

 

posted on 2019-09-26 21:59  风zk  阅读(118)  评论(0编辑  收藏  举报

导航