Javascript: 原型对象

123 阅读3分钟

原型对象

1.构造函数new的工作原理

1000.gif (1)了解工厂函数

作用:用于批量创建对象的函数

      //工厂函数 :解决创建多个代码对象冗余 
      function createPerson (name, age, sex) {
        //(1)创建空对象
        let p = {}
        //(2)对象赋值
        p.name = name
        p.age = age
        p.sex = sex
        //(3)返回创建好的对象
        return p
      }

      let p1 = createPerson('ikun', 32, '男')
      let p2 = createPerson('班长', 38, '男')
      let p3 = createPerson('王悦', 28, '男')
      console.log(p1, p2, p3)

(2)构造函数 原理:使用new关键字调用一个函数

 function Person (name, age, sex) {
        //(1)创建空对象  {}
        //(2)将this指向这个对象  this = {}
        //(3)对象赋值
        this.name = name
        this.age = age
        this.sex = sex
        //(4)返回这个对象  return this
      }

      let person1 = new Person('ikun', 32, '男')
      let person2 = new Person('班长', 38, '男')
      let person3 = new Person('王悦', 28, '男')
      console.log(person1, person2, person3)

(3)原型对象

  • 原型:任何构造函数在被创建的时候,系统都会自动帮我们创建一个与之对应的对象,称之为原型对象
-   同时解决内存浪费与全局变量污染的问题
  • 谁可以访问原型对象中的成员(属性和方法)
-   构造函数自身:`构造函数名.prototype`
-   构造函数实例化的每一个对象:点语法直接访问

1001.gif

1001.jpg

(4)__proto__属性介绍

  • 1.属于对象,指向实例化这个对象的构造函数对应的原型 *
  • 2.proto属性不是W3C标准,所以实际开发中一般不会使用它来访问原型,*
  • 往原型添加属性方法,最好使用构造函数访问,一般用‘构造函数名.prototype’*

1002.jpg

1101.jpg

       /* 
        1.prototype属性: 属于构造函数,指向原型对象
            * 作用: 解决构造函数资源浪费+变量污染
        2.__proto__属性: 属于实例对象,指向原型对象
            * 作用: 可以让实例对象访问原型中的成员
        */

      //1.构造函数
      function Person (name, age) {
        this.name = name
        this.age = age
      }

      //2.原型对象
      Person.prototype.eat = function () {
        console.log('我中午真的吃了红烧鱼')
      }
      Person.prototype.country = '中国人'

      //3.实例对象
      let p1 = new Person('张三', 28)
      console.log(p1)

      /* 
      __proto__ : 属于实例对象,指向原型对象
      */
     console.log( Person.prototype === p1.__proto__ )//true

(4)constructor属性介绍

1301.jpg

  /* 
        1. prototype : 属于构造函数,指向原型对象
            * 作用:解决资源浪费+变量污染 
        2.__proto__ : 属于实例对象,指向原型对象
            * 作用: 可以让实例对象访问原型中的成员
        3.constructor: 属于原型对象,指向构造函数
            * 作用: 可以让实例对象 知道自己被哪一个构造函数创建的
        */

      //1.构造函数
      function Person (name, age) {
        this.name = name
        this.age = age
      }

      //2.原型对象
      Person.prototype.type = '哺乳动物'
      Person.prototype.eat = function () {
        console.log('吃东西')
      }

      //3.实例对象
      let p1 = new Person('布丁', 3)
      p1.eat()
      console.log(p1.type)

      /* 
      constructor : 属于原型对象,指向构造函数
        作用:可以让实例对象知道自己被那个构造函数创建的
      */

(5)静态成员与实例成员

 构造函数也可以有自己的属性: 例如prototype

    静态成员 : 属于函数对象的成员
    实例成员: 属于实例化对象的成员
    //构造函数
         function Person(name,age){
            this.name = name;
            this.age = age;
        };

        Person.aaa = '啊啊啊';
        console.log(Person.aaa);//静态成员
        

        //实例化对象
        let p1 = new Person('张三',20);

        console.log(p1.name);//实例成员
        console.log(p1.age);//实例成员