原型

//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