前端面试题系列 - 继续

也许会用一个系列,讲一下口试历程中经常会问的一些问题,以及我以为应当能够怎样回复。

固然,我的回复也并非标准答案,只是我本身的一些明白,也迎接其他人宣布本身的主意。

作为本系列的第一篇文章,就先讲讲被问的最多的 js 继续问题,然则应当不会写原型链相干的东西,

先罗列一个最简朴的问题:

写一个
inherit(superClass, subClass) 要领,完成
subClass 继续
superClass

问题隐含的内容

继续有哪些特性,怎样检测一个继续是不是胜利?

  1. 子类能够运用父类的要领和属性
  2. 子类能够自定义要领和属性,但应当不影响父类和其他继续同一个父类的子类
  3. 子类的原型链上能够找到父类(子类的__proto__应指向父类)
  4. 子类的实例能够经由过程 foo instanceof superClass 测试

罕见的解法

es5
function inherit(p, s) {
  s.prototype = Object.create(p.prototype, {
    constructor: {
      value: s,
      enumerable: false,
      writebale: true,
      configurable: true
    }
  })

  Object.setPrototypeOf ? Object.setPrototypeOf(s, p) : s.__proto__ = p
} 
es4
function inherit(p, s) {
  var f = new Function ()
  f.prototype = new p()
  var r = new f()
  s.prototype = r
  s.prototype.constructor = s
  s.__proto__ = p
  f = null
  r = null
}

引伸的问题:

  1. Object.create 是什么?怎样运用?
Object.create(proto, [propertiesObject])

Object.create 供应了一个建立对象的要领,运用现有的对象作为新建立对象的__proto__,同时能够传入添加到新对象的可罗列属性, 这些属性能够对应到Object.defineProperties 的第二个参数中。

返回值为所建立的新对象.

比方:

s.prototype = Object.create(f.prototype, {
  constructor: {
    value: s,
    enumberable: false,
    writealble: true,
    configurale: true
  }
})
  1. Object.defineProperties 是什么?怎样运用?能够罗列一个 Object.definProperties 的现实运用吗?

Object.defineProperties能够直接在一个对象上定义或修正属性,并返回该对象。

比方:

target = Object.defineProperties(target, props)

本质上 Object.defineProperties 是对Object.defineProperty 的集合挪用,能够明白为是Object.definePeropety的复数版。

Object.defineProperty 的运用要领为:

target = Object.defineProperty(target, prop, descriptor)

所以本质上Object.defineProperties 就是以下代码:

Object.keys(props).forEach(function (prop) {
  let descriptor = props[prop]
  Object.defineProperty(target, prop, descriptor)
})

个中 descriptor 的可选值有以下集合:

  • configurable: 当且仅当该属性的 configurable 为 true 时,该属性描述符才够被转变,同时该属性也能从对应的对象上被删除。默以为 false
  • enumerable: 当且仅当该属性的enumerable为 true 时,该属性才够出现在对象的罗列属性中。默以为 false
  • value: 该属性对应的值。能够是任何有用的 JavaScript 值(数值,对象,函数等)。默以为 undefined
  • writable: 当且仅当该属性的writable为true时,value才被赋值运算符转变。默以为 false。
  • get: 一个给属性供应 getter 的要领,假如没有 getter 则为 undefined。该要领返回值被用作属性值。默以为 undefined
  • set: 一个给属性供应 setter 的要领,假如没有 setter 则为 undefined。该要领将接收唯一参数,并将该参数的新值分配给该属性。默以为 undefined

假如一个 descriptor 不具有 value, writebale, getset 恣意一个关键字,那末将会被以为是一个数据描述符。
假如一个描述符同时具有(valuewritbale)和(getset),将会发生一个非常.

  1. 继续多个父类怎样做?

继续多个父类的话,能够运用 Object.assign 要领。
比方:

targe = Object.assign({}, superClassA, superClassB, ...)

然则继续多个父类的话,子类就不能经由过程 son instanceof superClass 如许的考证了.

  1. Object.assign 是什么?怎样用?用的时刻有哪些须要注重?

Object.assign 要领用于将一切可罗列属性从一个或多个源对象复制到目的对象,并返回目的对象,比方:

target = Object.assign(target, source)

假如具有同名属性,那末在后面对象中的属性,将会掩盖目的对象中的属性。

须要注重以下几点:

  • 继续属性不可罗列属性是不能拷贝的。
  • 原始范例会被包装为对象,null, undefined 会被疏忽,而且只要字符串的包装对象才可能有本身可罗列的属性.
  • 能够拷贝 symbol 范例的属性
  1. Object.assign 会挪用 settergetter 吗?挪用的是那里的settergetter ?

Object.assign 会挪用源对象的 getter,并把源对象的 getter 的返回值当作新对象的该属性的值。
setter 则是会直接加在新建立的对象中,而不会相沿源对象的 setter.

  1. Object.getOwnPropertyDescriptor 是什么?重要用来做什么?

Object.getOwnPropertyDescriptor 返回直到对象上一个自有属性对应的描述符,比方:

Object.getOwnPropertyDescriptor(obj, prop)
    原文作者:tobeyouth
    原文地址: https://segmentfault.com/a/1190000016299969
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞