欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-29 11:28:43
第一个问题:什么是作用域? 第二个问题:作用域在上面情况下形成? 第三个问题:什么是变量提升,作用域链? 第四个问题:“=”赋值运算 第五个问题:生成对象的有几种方式? 第六个问题:面向对象的三大特点 第七个问题:原型链 第八个问题:prototype和__proto__的区别? 第九个问题:jso ......

 

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

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

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

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

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

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

第七个问题:原型链

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