第一个问题:什么是作用域? 第二个问题:作用域在上面情况下形成? 第三个问题:什么是变量提升,作用域链? 第四个问题:“=”赋值运算 第五个问题:生成对象的有几种方式? 第六个问题:面向对象的三大特点 第七个问题:原型链 第八个问题:prototype和__proto__的区别? 第九个问题:json和Object的区别? 第十个问题:类和实例的关系? 第十一个问题:工厂模式和构造函数生成实例对象的指向? 第十二个问题:类的原型指定或不指定一个对象? 第十三个问题:this的指向问题和方法中this的指向问题?改变this的几种方法? 第十四个问题:链式写法的实现原理? 第十五个问题:原型的批量添加和对象添加的区别? 第十六个问题:怎么给内置对象添加方法? 第十七个问题:什么是深拷贝和浅拷贝? 第一个问题:什么是作用域? 首先我们要知道什么是作用域?浏览器给(js)的生存环境就叫作用域,也叫栈内存。 当然还有一个堆内存,什么是堆内存就是存放代码块的空间。 第二个问题:作用域在上面情况下形成? (1)浏览器天生有一个全局叫window (2)函数执行时会形成一个私有作用域 第三个问题:什么是变量提升,作用域链? 这是变量提升它也叫预解释,js代码执行前,浏览器会给js一个全局环境也叫全局作用域(也叫window),window分两个模块,存储模块和执行模块,存储模块找到所有待var 和 function 的关键字,给这些遍历添加内存地址,执行模块代码从上到下执行,遇到变量就去存储模块查找,看有没有,有就看赋值没有赋值就是后面的值,没赋值就是undefined,没有就是 is not defined。 函数内部的变量被使用时,首先会在自己的私有作用域下查找是否有这个变量,有就使用,没有就向它的父级查找,父级有就使用,没有就继续向上查找,直到查找到window,window有就使用没有就是is not defined。这种查找机制我们叫作用域链。 第四个问题:“=”赋值运算 =赋值运算,就是把等号后面的值赋给等号前面的变量。 后面的数据分两种 基本数据类型:基本数据类型就是简单的赋值。 引用数据类型(复合数据类型)就是把内存地址赋值给变量。 第五个问题:生成对象的有几种方式? 第一种:单例模式 第二种:工厂模式 第三种:构造函数 第四种:类的实例 其中构造函数扮演三种角色,普通对象,普通函数,和类 第六个问题:面向对象的三大特点 封装:减少代码冗余,提高代码重复利用率 继承:子类继承父类。 多态:以后在说 第七个问题:原型链 duixiang.shuxing 的时候,首先看这个属性是私有的还是公有的,私有有就直接使用,如果私有属性没有那就找公有的,公有有就使用,公有属性没有那就通过__proto__找它类上有没有,直到找到基类Object,如果Object没有那就是undefined。 第八个问题:prototype和__proto__的区别? 他俩都是原型,prototype是函数属性,__proto__是对象属性,prototype是给程序员用的,__proto__用于给浏览器查找原型的。 第九个问题:json和Object的区别? 二者长得一样,都是以键值对形式存放,Object可以不带引号,json必须带引号,Object是前端数据类型,json是数据库存放数据的数据格式。 第十个问题:类和实例的关系? 每个类(函数)都有一个prototype属性,属性是个对象,里面有一个constructor属性,指向当前类本身。 每个实例(对象)都天生有一个__proto__的属性,属性也是个对象,它指向当前类的原型。 第十一个问题:工厂模式和构造函数生成实例对象的指向? 工厂模式生成的实例对象的__proto__直接指向基类Object的原型。 构造函数生成的实例对象的__proto__指向它父类的原型,父类的原型的__proto__再指向基类Obcect的原型。 第十二个问题:类的原型指定或不指定一个对象? 如果不给这个类的原型指定一个对象,这个实例对象的__proto__上有一个constructor的属性。 如果给这个类的原型指定一个对象,这个实例对象的__proto__就没有constructor属性。 第十三个问题:this的指向问题和方法中this的指向问题?改变this的几种方法? 1.this是一个对象,函数外的this指向window 2.函数内的this,给函数在哪定义没关系,给函数在哪调用有关,看函数前面有没有 . 有点this就指向点前面的对象,没有就指向window。 3.定时器里的this永远指向window,自执行里的this也指向window。 4.构造函数和原型上的this指向它的实例对象 5.方法中this,在调用方法时,看方法点前面是谁,this就指向谁。 改变this有几种方法? 提前声明一个变量,var _this=this apply()call() bind() apply()和call()执行是一样的,都是将函数的this改成第一个参数,并将函数执行,不同的是从第二个参数开始apply()是有关数组, bind() 只改变函数内this,不执行函数,如果执行就要人为定义,在后面加有关() 第十四个问题:链式写法的实现原理 每个方法使用完毕之后,不仅可以得到想要的结果,还需要把实例对象给调用,才可以实现链式写法。 第十五个问题:原型的批量添加和对象添加的区别? 如果是批量添加:不会改变原型上的内存地址(浏览器开辟的) 如果是对象添加:会改变原型上的内存地址(浏览器开辟的就会被销毁) 第十六个问题:怎么给内置对象添加方法? 有两种,用对象形式添加,会不起作用,Array.prototype={sun:function}错的,浏览器会保护内置对象的原型地址 批量添加:是可以的 Array.prototype.age=45; 第十七个问题:什么是深拷贝和浅拷贝? 浅拷贝:就是将一个对象的属性一个一个的复制到另一个对象,主要针对第一层的。 深拷贝:如果对象中的属性值又有一个引用数据类型,浅拷贝还会把后面的引用数据类型地址赋给空对象的属性,深拷贝会把属性值一个一个的遍历赋值。 |
|
来自: python_lover > 《待分类》