• 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属性指回原来的构造函数;

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

          三者关系

  • 相关阅读:
    剑指offer 合并两个排序的链表
    剑指offer 把字符串转换成整数
    剑指offer 数组中重复的数字
    剑指offer 数字在排序数组中出现的次数
    剑指offer 替换空格
    go学习笔记-错误处理
    go学习笔记-类型转换(Type Conversion)
    go学习笔记-语言指针
    go学习笔记-包处理
    go学习笔记-面向对象(Methods, Interfaces)
  • 原文地址:https://www.cnblogs.com/baller-gxk/p/12727149.html
Copyright © 2020-2023  润新知