JavaScript构造函数和原型概述

对象创建的三种方式:

  1. 利用new Object()创建对象;
    var obj = new Obejct();
  2. 利用对象字面量创建对象;
    var obj= {};
  3. 利用构造函数创建对象;
    function Star(name ,age){
       this.name = name;
      this.age = age;
      this.sing=function(){
      console.log("唱歌");
    }    
    }
    var gg = new Star('张国荣',18);
    gg.sing();

    new 做了哪些事情?

           在内存中创建了一个空对象;让this指向这个新对象;执行构造函数里面的代码,给这个新的对象添加属性和方法;返回这个新对象(所以构造函数中不需要return);

   实例成员和静态成员

    实例成员:通过this添加的成员,只能通过实例化的对象访问;如上述代码中的Star对象中的name,age,sing成员;

    静态成员:在构造函数上直接添加的属性,只能通过构造函数访问;如Star.sex=“男”;通过gg这个实例化的对象是访问不了的;

   构造函数的问题

    1、浪费内存;(每个实例化的对象中的函数都会开辟一个新的内存空间;)解决方法:protptype(原型对象)

   构造函数原型对象:prototype

    构造函数通过原型分配的函数是所有对象共享的;javaScript规定每个构造函数中都会有一个prototype属性,指向另一个对象,这个prototype就是一个对象,这个对象的所有属性和方法,都会被构造              函数所拥有;(我们可以把不变的方法,直接定义在prototype对象上,这样所有对象的实例就可以共享这些方法);

    一般情况下,公共的属性定义在构造函数中,但公共的方法定义在构造函数的原型中;

Star.prototype.sing=function(){
        console.log("我会唱歌");
    }
var gg = new Star('张国荣',18);
var ldh =new Star('刘德华',18);
gg.sing();
ldh.sing();

   对象原型:__proto__

    对象都会有一个属性__proto__指向构造函数的protype原型对象,之所以我们在对象中可以使用构造函数prototype原型对象的属性和方法,就是因为有__proto__原型的存在;

            如果我们自改了原来的原型对象,给对象赋值给一个对象必须手动添加constrictor属性指回原来的构造函数;

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

      三者关系

原文地址:https://www.cnblogs.com/baller-gxk/p/12727149.html