美文网首页
回味JS(五)面向对象编程

回味JS(五)面向对象编程

作者: ArmorVon | 来源:发表于2019-06-16 23:24 被阅读0次

    什么是对象(广义上其他语言中的对象)?

    • 对象是单个实物的抽象
    • 对象是一个容器,封装了属性(property)和方法(method)

    构造函数有什么特点?

    • 函数体内部使用了this关键字,代表了所要生成的对象实例。
    • 生成对象的时候,必须使用new命令。

    new命令的原理是什么?

    1. 创建一个空对象
    2. 将这个空对象的原型指向构造函数的prototype属性
    3. 绑定this指向,即指向这个空对象
    4. 开始执行构造函数内部的代码

    手动实现一个new:

    function newObject ()  {
       var obj = new Object()              // 从Object.prototype上克隆一个空对象 
       obj.__proto__ = Constructor.prototype  // 指向构造器的prototype
       var Constructor = [].shift.call(arguments)  
       var ret = Constructor.apply(obj, arguments)  
       return typeof ret === 'object' ? ret : obj
    }
    

    如果忘了使用new命令,直接调用构造函数会发生什么事?

    • 这个构造函数就变成了普通函数,并不会生成实例对象
    • this这时代表全局对象

    构造函数内部return语句有什么注意点?

    • 有return语句时,如果后面跟的是对象,则返回这个指定的新对象;否则,就会不管return语句,返回this对象

    Object.create(null)和new object()和{}的区别?

    • 这三个都是创建空对象的方法
    • Object.create(null)创建的是一个干净的空对象,在该对象上没有继承 Object.prototype 原型链上的属性或者方法,例如:toString(), hasOwnProperty()等方法
    • 通过{}创建的对象和new Object()的方式是一样的,都会继承Object对象的所有属性,new创建出的空对象会绑定Object的prototype原型对象
    • 使用for…in循环的时候会遍历对象原型链上的属性,使用create(null)生成的空对象不会再被检查属性

    什么情况下使用Object.create()来生成对象?

    1. 当你需要一个非常干净且高度可定制的对象当做数据字典的时候
    2. 需要自己定义hasOwnProperty、toString方法的时候

    Object.create()生成对象的原理是是什么?

    1. 内部定义一个构造函数
    2. 将参数绑定到这个构造函数的Prototype,
    3. 返回这个构造函数的实例对象

    内部实现的代码原理如下:

    function create(o){
        function F(){}
        F.prototype = o;
        return new F();
    }
    

    this的指向?

    在 ES5 中,其实 this 的指向,始终坚持一个原理: this 永远指向最后调用它的那个对象
    this的指向常见于以下几种绑定方式:

    1. 默认绑定 (函数调用), 指向全局
    2. 隐式绑定 (方法调用), 当函数引用有上下文对象时,this指向这个上下文对象
    3. 显式绑定 (简介调用), 通过call()或者apply()绑定的this
    4. new绑定 (构造函数调用), 指向new出来的这个对象
    5. 箭头函数绑定, 箭头函数本身没有this,绑定的是最近一层非箭头函数的 this

    改变this的几个方法,call、apply、bind有什么异同?

    • call方法的第一个参数就是this所要指向的那个对象,如果参数为空、null和undefined,则默认传入全局对象;可以接受多个参数。
    • apply方法的作用与call方法类似,但是第二个参数为数组
    • bind方法用于将函数体内的this绑定到某个对象,然后返回一个新函数;bind与apply和call的区别就是bind不会被立即调用,它返回的是一个函数

    apply() 有哪些应用场景?

    1. 找出数组最大元素
    Math.max.apply(null, array) 
    
    1. 将数组的空元素变为undefined
    Array.apply(null, ['a', ,'b'])  // [ 'a', undefined, 'b' ]
    
    1. 转换类数组的对象
    Array.prototype.slice.apply({0: 1, length: 2}) // [1, undefined]
    

    相关文章

      网友评论

          本文标题:回味JS(五)面向对象编程

          本文链接:https://www.haomeiwen.com/subject/obwnfctx.html