理解面向对象的几个问题须知?

 

第一个问题:什么是作用域?

第二个问题:作用域在上面情况下形成?

第三个问题:什么是变量提升,作用域链?

第四个问题:“=”赋值运算

第五个问题:生成对象的有几种方式?

第六个问题:面向对象的三大特点

第七个问题:原型链

第八个问题: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

 

posted @ 2019-01-13 20:37  晋飞翔  阅读(490)  评论(0编辑  收藏  举报