美文网首页Web
JS中的原型对象

JS中的原型对象

作者: 追逐_chase | 来源:发表于2019-07-26 09:22 被阅读1次
    web.jpeg

    前面我们已经知道创建对象的多种方式对象的认知,其中自定义构造函数在创建对象时方便使用,但是存在一个小问题

    1. 自定义构造函数 和 对象实例之间的关系

     //构造函数
      function Person(name,age){
          this.name = name;
          this.age = age;
      }
    
      //创建实例
      var per = new Person("CC",18);
      //打印对象的所有属性和方法
      console.dir(per);
      //打印构造函数的所有属性和方法
      console.dir(Person);
    
      console.log(per.__proto__.constructor == Person);
      // constructor 是实例对象的构造器(构造函数)
      // per这个实例是通过Person构造函数创建的
      console.log(per.constructor == Person);
    
    
    image.png

    实例对象和构造函数之间的关系
    1.实例对象是通过构造函数创建的 --->创建的过程叫做实例化
    2.如何判断对象是不是一个类的实例
    - 通过构造器的方式,per.__proto__.constructor == Person
    - 通过 instanceof

    清楚了实例和构造函数之间的关系后,那么我们自定义构造函数到底存在什么问题呢?
      //构造函数
      function Person(name,age){
          this.name = name;
          this.age = age;
          //实例方法
          this.paly = function(){
              console.log("玩耍呢-----");
              
          }
      }
    
    //创建实例
      var per = new Person("CC",18);
      var per2 = new Person("TT",19);
      console.log(per.paly == per2.paly);
    
    //打印是fale
    
    

    上面的代码我们可以推断出,创建的2个对象的方法 并不是同一个方法,如果我们创建100的对象,跟着构造函数就会创建出100个play方法,就好像一个学校有100人,给这100人中的每一个人都分配一个独立的厕所,这样就会浪费空间资源,那么怎么解决这个问题呢? 原型prototype

    2 . prototype原型(给类添加共有的方法或者属性)

    • 作用:共享数据,节省内存空间
    • 类.prototype.方法名 = function() {}具体格式
    function Person(name,age){
            this.name = name;
            this.age = age;
        }
    //原型添加 方法
     Person.prototype.sayHello = function(){
           console.log("我是:" + this.name);
       }
    
     var per = new Person("cc","age");
       //调用原型方法
       per.sayHello();
       console.log(per);
       
       var per1 = new Person("TT","120");
    
       per1.sayHello();
       console.log(per1);
    
    //同一个函数
    console.log(per1.sayHello == per.sayHello);
    
    
    image.png

    构造函数创建的时候,系统会默认创建一个对象与之关联,这个对象就是 原型对象

    以构造函数创建的对象中,都会有一个 隐含的属性__proto__,指向该构造函数的原型对象,然而每一个构造函数都有一个prototype 指向原型对象

    1. 构造函数创建实例对象
      2.构造函数有prototype 属性,指向原型对象
      3.实例对象有__proto__(IE没有此属性)原型属性 是指向原型对象
      4.原型对象中有constructor构造器指向构造函数
      5.构造函数的原型对象prototype中的方法是可以被实例对象直接访问的
    image.png
    2.1 原型对象的数据共享
      //构造函数
      function Person(name,age){
          this.name = name;
          this.age = age;
    
      }
    
    //原型对象的属性
      Person.prototype.height = "1.80";
     var per1 = new Person();
      console.dir(per1);
      console.dir(per1.height);
      console.dir(Person);
    
    image.png

    上面的代码中我们可以知道,实例对象使用的属性或者方法,优先在自己的实例中查找,如果找到就直接使用,如果找不到就去实例对象的__proto__指向的原型对象中查找,找到使用,没有报错

    替换系统的原型对象

    我们知道 构造函数有一个prototype属性指向系统的原型对象,而系统的原型对象有一个原型构造器constructor指向构造函数

    如果我们需要自定义共享的属性和方法过多时,系统的原型对象有时满足不了,就需要我们自己定义一个对象,赋值给原型对象
       //构造函数
      function Person(name,age){
          //构造函数内部会创建一个对象
          //并把这个对象赋值给 this
          this.name = name;
          this.age = age;
    
      }
    
    //原型是对象,那么就有有对象的创建方式
      Person.prototype = {
         constructor:Person,
          height:1.80,
          wight:"55KG",
          play:function(){
              console.log("很会玩");
              
          },
      _init:function(){
    
          },
          update:function(){
              
          }
      };
      
    
    

    在创建原型对象时constructor这个属性一定要存在的,且必须指向构造函数

    • hasOwnProperty()来检查对象自身中是否含有该属性
    console.log(per1.hasOwnProperty("name")); //返回true就说明有这个属性 
    
    console.log(per1.hasOwnProperty("a")); //返回false就说明没有这个属性
    
    • isPrototypeProperty("属性名","实力对象")判断一个对象是否是指定对象的原型对象

    相关文章

      网友评论

        本文标题:JS中的原型对象

        本文链接:https://www.haomeiwen.com/subject/odpxrctx.html