美文网首页
回味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(五)面向对象编程

    什么是对象(广义上其他语言中的对象)? 对象是单个实物的抽象 对象是一个容器,封装了属性(property)和方法...

  • js面向对象

    js面向对象(第五周) 什么是面向对象 面向对象是一种编程思想,是在面向过程编程(结构化编程)之后出现的,面向对象...

  • javascript面向对象编程

    javascript面向对象编程一(封装) 通俗易懂绝对干货 JS面向对象编程

  • ES6中的类的总结

    js常用的编程模式有面向过程编程和面向对象编程(1)面向过程编程“面向过程”(Procedure Oriented...

  • 浅谈JS中的面向对象

    浅谈JS中的面向对象 本文主要说说本人在JS中对面向对象的理解。 计算机编程语言主要分为面向过程式编程和面向对象式...

  • js高级 第一章

    JS面向对象编程 一、什么是面向对象思想(编程思想角度)? 现有的两种程序思想:面向过程和面向对象 1.面向过程...

  • 面试题的总结与解答

    1,js中this指向的理解 在js面向对象编程里我们避免不了使用this,所以理解this指向对于在面向对象编程...

  • JS面向对象

    JS面向对象入门 1、面向对象语言概念面向对象语言主要包括 类、对象、封装、多肽。2、面向对象的编程思想面向过程思...

  • JS高级3-语言特性

    一、 JS面向对象编程 1、 面向对象介绍 什么是对象? Everything is object (万物皆对象)...

  • RYF javascript笔记3

    4. 面向对象编程 4.1面向对象编程概述 4.1.1简介 4.1.1.1构造函数 js没有“类”,而改用构造函数...

网友评论

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

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