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


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

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

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

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

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

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

    第七个问题:原型链

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

  • 相关阅读:
    appium---webview(H5)元素定位
    appium---切换webview时报错
    appium---如何判断原生页面和H5页面
    JDK与Java SE/EE/ME的区别
    Ubantu18.04安装WPS
    堆与栈的区别
    JAVA-基础(Stream流)
    Java面试(1)
    ubuntu自带截图工具
    Linux 下各个目录的作用及内容
  • 原文地址:https://www.cnblogs.com/jinfeixiang/p/10263904.html
Copyright © 2020-2023  润新知