lib: flag to conditionally modify proto on deprecate · nodejs/node@d555db2

@@ -169,7 +169,7 @@ function pendingDeprecate(fn, msg, code) {

169169

// Mark that a method should not be used.

170170

// Returns a modified function which warns once by default.

171171

// If --no-deprecation is set, then it is a no-op.

172-

function deprecate(fn, msg, code, useEmitSync) {

172+

function deprecate(fn, msg, code, useEmitSync, modifyPrototype = true) {

173173

// Lazy-load to avoid a circular dependency.

174174

if (validateString === undefined)

175175

({ validateString } = require('internal/validators'));

@@ -192,19 +192,23 @@ function deprecate(fn, msg, code, useEmitSync) {

192192

return ReflectApply(fn, this, args);

193193

}

194194195-

// The wrapper will keep the same prototype as fn to maintain prototype chain

196-

ObjectSetPrototypeOf(deprecated, fn);

197-

if (fn.prototype) {

198-

// Setting this (rather than using Object.setPrototype, as above) ensures

199-

// that calling the unwrapped constructor gives an instanceof the wrapped

200-

// constructor.

201-

deprecated.prototype = fn.prototype;

202-

}

195+

if (modifyPrototype) {

196+

// The wrapper will keep the same prototype as fn to maintain prototype chain

197+

// Modifying the prototype does alter the object chains, and as observed in

198+

// most cases, it slows the code.

199+

ObjectSetPrototypeOf(deprecated, fn);

200+

if (fn.prototype) {

201+

// Setting this (rather than using Object.setPrototype, as above) ensures

202+

// that calling the unwrapped constructor gives an instanceof the wrapped

203+

// constructor.

204+

deprecated.prototype = fn.prototype;

205+

}

203206204-

ObjectDefineProperty(deprecated, 'length', {

205-

__proto__: null,

206-

...ObjectGetOwnPropertyDescriptor(fn, 'length'),

207-

});

207+

ObjectDefineProperty(deprecated, 'length', {

208+

__proto__: null,

209+

...ObjectGetOwnPropertyDescriptor(fn, 'length'),

210+

});

211+

}

208212209213

return deprecated;

210214

}