理解面向对象的几个问题须知?
第一个问题:什么是作用域?
第二个问题:作用域在上面情况下形成?
第三个问题:什么是变量提升,作用域链?
第四个问题:“=”赋值运算
第五个问题:生成对象的有几种方式?
第六个问题:面向对象的三大特点
第七个问题:原型链
第八个问题: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;
第十七个问题:什么是深拷贝和浅拷贝?
浅拷贝:就是将一个对象的属性一个一个的复制到另一个对象,主要针对第一层的。
深拷贝:如果对象中的属性值又有一个引用数据类型,浅拷贝还会把后面的引用数据类型地址赋给空对象的属性,深拷贝会把属性值一个一个的遍历赋值。
作者:晋飞翔
QQ(微信同步)318080891