# baseConformsTo
# Description
conformsto 的基本实现,接受 props 检查。
会对 object 的 指定 props 属性做检查,检查函数由source提供
# Params
(object, source, props)
{Object} object
{Object} source
# Return
Boolean
# Code
function baseConformsTo(object, source, props) {
let length = props.length
if (object == null) {
return !length
}
object = Object(object)
while (length--) {
const key = props[length]
const predicate = source[key]
const value = object[key]
if ((value === undefined && !(key in object)) || !predicate(value)) {
return false
}
}
return true
}
# Analyze
- 首先拿到
props.length, 判断传入的object是否为null或者undefined,如果是则返回!length即可。如果有要检测的 属性则返回false,否则返回true - 使用
Object()构造函数,将object包装为一个新对象 ,基础类型也会转为object - 使用
while循环遍历,条件为length--,在条件中已经进行了递减,在代码块中就从length - 1开始 - 首先从
props中获取对应的key, 根据key分别从source和object中拿到predicate和value - 判断
key是否在object和其原型链 上存在,或者value不通过predicate的校验,则返回false - 如果全部通过校验,并且 所有
key都在object和其原型链上,则返回true
# Remark
- Object () 构造函数 MDN (opens new window)
- in MDN (opens new window) 如果指定的属性在指定的对象或其原型链中,则in 运算符返回 true
# Example
const a = {a: 1, b: 2}
const b = Object.create(null)
b['a'] = b['b'] = x => x > 0
baseConformsTo(a, b, ['a', 'b']) // true