zoukankan      html  css  js  c++  java
  • js高级中的原型

    原型

    //prototype 叫原型,每个构造函数中都有这个属性,但这个属性也是一个对象,所以叫”原型对象“---程序员用的


    //__proto__ 叫原型,每个实例对象中都有这个属性,这个属性也是一个对象,所以也叫”原型对象“---浏览器用的

    构造函数中有一个属性:prototype,叫原型,也是对象,叫原型对象,程序员用的

    实例对象中有一个属性:__proto__,叫原型,也叫原型对象,浏览器用的

    实例对象的__proto__指向的是自己的构造函数中的原型对象:prototype

    如果实例对象中的属性和原型对象中的属性名重名,不会修改原型对象中属性的值

    实例对象的__proto__ 指向了构造函数中的原型对象prototype
    对象.__proto__  ------> 构造函数.prototype
    原型对象中(prototype)有一个属性叫:constructor(构造器)指向的是自己的构造函数

    原型的指向是可以改变的

    对象里面都有 __proto__原型对象


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


    构造函数中有原型的属性---->原型对象(prototype


    实例对象的原型__proto__指向了构造函数中的原型对象(Student.prototype


    console.log(stu1.__proto__ === Student.prototype);


    //构造函数 和 原型对象中的 this 都指向------>实例对象

    //实例对象中没有prototype原型对象,但是有__proto__原型,指向的是自己的 构造函数中的原型对象(prototype
    构造函数中有prototype原型对象------>里面还有一个__proto__原型对象

     ***原型链*****

     实例对象和原型对象之间是通过__proto__来联系的,这种关系叫做原型链

    *实例对象的__proto__指向自己的构造函数的原型对象(prototype),

    构造函数的原型对象(prototype)中的__proto__指向的是Object.prototype

      Object.prototypede中的__proto__指向的是 null

    面向对象的思想:是编程的一种思想
    面向对象的特性: 封装 继承 多态
    1.封装:把代码进行包装,使用的时候统一调用
    2.继承:类与类之间的关系,但是JS不是一门真正的面向对象语言,hi模拟面向 对象的思想进行编译,JS中的继承是基于原型的
    3.多态:同一个行为针对不同的对象,产生不同的结果,主要子设计模式中体现

    原型链的指向可以改变

    JS中的继承是局域原型:把原型的指向改变就可以实现继承
    继承的方式:
     1.拷贝继承(克隆继承)--->把一个对象中的属性全部拷贝一份存放到另一个对象中
    2.对象冒充:没有继承,假的继承,但是调用了其他构造函数中的属性了,调用完直接删除。给调用者的感觉发生了继承
    3.组合继承:调用了call方法,改变了this的指向,也改变了原型的指向

     函数定义方式
    1.函数声明
     function f1(){};   函数的调用f1();

     2.函数表达式
    var ff = function f2() {};  函数调用: f2();

     3.Function构造函数方式定义函数
    var ff = new Function("num1","num2","return num1+num2");

    作用域链:当函数内部访问一个变量的时候,这个变量在这个函数内部不存在是,就去这个函数的外面(上面)查找,找到了就能够使用,找不到继续向外面(上面)找,直到找到函数所在的这个的script标签中(全局作用域)

    全局的作用域中的定义的变量可以看成是在作用域链的最上面(0级作用域

    作用用最高是0级,0  1  2  3   4   数字越大 等级越低,越往里

    闭包:一个函数A有个函数B,函数B可以访问函数A中定义的变量,此时还可以进行数据的缓存,形成了闭包

    闭包作用:缓存数据

    缺陷:延长作用域链,长时间的内存得不到释放

    闭包的两种方式

    1.函数模式:函数中有函数

    2.对象模式:函数中有对象

    沙箱:在虚拟的世界中模拟真实的世界,结果和真实世界的结果一样,但不影响真实世界的样子

    作用:隔离外部数据

    原型链

    函数都是对象,对象不一定是函数(Math

    构造函数:function F1()({};  function OPbject(){};  function Function(){};

    对象中都有prototype原型:指向自己的原型对象F1.prototype

             __proto__原型:指向大的Function中的原型对象Function.prototype

    Var ff = new F1()中的__proto__原型:指向自己的构造函数的原型对象F1.prototype

    总结原型链

    构造函数中有prototype,指向的是自己的原型对象

    构造函数也是函数,函数也是对象

    实例对象中有__proto__,指向的是的构造函数的原型对象prototype

    函数中有prototype,函数也是对象,所以也有__proto__

    函数本身也是Function的实例对象

    实例对象的原型__proto__指向的自身的原型对象prototype,原型对象中也有__proto__,指向的是Object的原型对象prototype

    函数是对象,普通函数也是对象,Function也是对象

    普通函数都是由Function产生的

    函数一定是对象 对象不一定是函数(Math

    判断Array 是不是对象 ------instanceOf-----------

    Function f1(){};--------普通函数

    F1里有prototype__proto__,prototype中又有__proto__

    **普通函数里的prototype(自己的原型对象)里面的__proto__指向的是Object.prototype

    **普通函数的__proto__指向的是Function里的prototypeFunction.prototype里的__proto__指向的是Object.prototype

  • 相关阅读:
    java编译错误No enclosing instance of type TestFrame is accessible. Must qualify the allocation with an enclosing instance of type TestFrame (e.g. x.new A(
    java 2中创建线程方法
    动态规划基本思想
    关于eclipse编译一个工程多个main函数
    java Gui初识
    Eclipse中java项目的打包
    java 播放声音
    把资源文件夹导入到eclipse中
    Java建立JProgressBar
    How to grant permissions to a custom assembly that is referenced in a report in Reporting Services
  • 原文地址:https://www.cnblogs.com/zhushenshen/p/6718801.html
Copyright © 2011-2022 走看看