constructor(obj, msg, ssfi, lockSsfi) {
    util.flag(this, 'ssfi', ssfi || Assertion);
    util.flag(this, 'lockSsfi', lockSsfi);
    util.flag(this, 'object', obj);
    util.flag(this, 'message', msg);
    util.flag(this, 'eql', config.deepEqual || util.eql);

    return util.proxify(this);
  }
Creates object for chaining.
`Assertion` objects contain metadata in the form of flags. Three flags can
be assigned during instantiation by passing arguments to this constructor:

- `object`: This flag contains the target of the assertion. For example, in
the assertion `expect(numKittens).to.equal(7);`, the `object` flag will
contain `numKittens` so that the `equal` assertion can reference it when
needed.

- `message`: This flag contains an optional custom error message to be
prepended to the error message that's generated by the assertion when it
fails.

- `ssfi`: This flag stands for "start stack function indicator". It
contains a function reference that serves as the starting point for
removing frames from the stack trace of the error that's created by the
assertion when it fails. The goal is to provide a cleaner stack trace to
end users by removing Chai's internal functions. Note that it only works
in environments that support `Error.captureStackTrace`, and only when
`Chai.config.includeStack` hasn't been set to `false`.

- `lockSsfi`: This flag controls whether or not the given `ssfi` flag
should retain its current value, even as assertions are chained off of
this object. This is usually set to `true` when creating a new assertion
from within another assertion. It's also temporarily set to `true` before
an overwritten assertion gets called by the overwriting assertion.

- `eql`: This flag contains the deepEqual function to be used by the assertion.

@param {unknown} obj target of the assertion
@param {string} [msg] (optional) custom error message
@param {Function} [ssfi] (optional) starting point for removing stack frames
@param {boolean} [lockSsfi] (optional) whether or not the ssfi flag is locked