也许会用一个系列,讲一下口试历程中经常会问的一些问题,以及我以为应当能够怎样回复。
固然,我的回复也并非标准答案,只是我本身的一些明白,也迎接其他人宣布本身的主意。
作为本系列的第一篇文章,就先讲讲被问的最多的 js 继续
问题,然则应当不会写原型链相干的东西,
先罗列一个最简朴的问题:
写一个
inherit(superClass, subClass)
要领,完成
subClass
继续
superClass
问题隐含的内容
继续有哪些特性,怎样检测一个继续是不是胜利?
- 子类能够运用父类的要领和属性
- 子类能够自定义要领和属性,但应当不影响父类和其他继续同一个父类的子类
- 子类的原型链上能够找到父类(子类的__proto__应指向父类)
- 子类的实例能够经由过程
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
}
引伸的问题:
-
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
}
})
-
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
, get
和 set
恣意一个关键字,那末将会被以为是一个数据描述符。
假如一个描述符同时具有(value
或writbale
)和(get
或set
),将会发生一个非常.
- 继续多个父类怎样做?
继续多个父类的话,能够运用 Object.assign
要领。
比方:
targe = Object.assign({}, superClassA, superClassB, ...)
然则继续多个父类的话,子类就不能经由过程 son instanceof superClass
如许的考证了.
-
Object.assign
是什么?怎样用?用的时刻有哪些须要注重?
Object.assign
要领用于将一切可罗列属性从一个或多个源对象复制到目的对象,并返回目的对象,比方:
target = Object.assign(target, source)
假如具有同名属性,那末在后面对象中的属性,将会掩盖目的对象中的属性。
须要注重以下几点:
- 继续属性和不可罗列属性是不能拷贝的。
- 原始范例会被包装为对象,
null
,undefined
会被疏忽,而且只要字符串的包装对象才可能有本身可罗列的属性. - 能够拷贝
symbol
范例的属性
-
Object.assign
会挪用setter
和getter
吗?挪用的是那里的setter
和getter
?
Object.assign
会挪用源对象的 getter
,并把源对象的 getter
的返回值当作新对象的该属性的值。setter
则是会直接加在新建立的对象中,而不会相沿源对象的 setter
.
-
Object.getOwnPropertyDescriptor
是什么?重要用来做什么?
Object.getOwnPropertyDescriptor
返回直到对象上一个自有属性对应的描述符,比方:
Object.getOwnPropertyDescriptor(obj, prop)