不支持选项[methodName]

时间:2017-06-22 12:48:43

标签: node.js prototype

我正在尝试在我的js app中扩展Object类。

以下是方法:

Object.prototype.safeGet = function(props, defaultValue) {
  console.log(this, props, defaultValue);
  if (typeof props === 'string') {
    props = props.split('.');
  }
  if (this === undefined || this === null) {
    return defaultValue;
  }
  if (props.length === 0) {
    return this;
  }
  return this.safeGet(props.slice(1), defaultValue);
};

当我加载它时,我得到:

the options [safeGet] is not supported

然后这个方法似乎被调用(虽然我的代码中没有任何地方),使用以下参数(来自console.log):

SchemaString {
  enumValues: [],
  regExp: null,
  path: 'source',
  instance: 'String',
  validators: 
   [ { validator: [Function],
       message: 'Path `{PATH}` is required.',
       type: 'required' } ],
  setters: [],
  getters: [],
  options: 
   { type: [Function: String],
     index: true,
     required: true,
     safeGet: [Function],
     runSettersOnQuery: undefined },
  _index: true,
  isRequired: true,
  requiredValidator: [Function],
  originalRequiredValue: true } [Function] undefined

使用NodeJS

$ node --version
v4.8.3

知道发生了什么事吗?更改名称无济于事。

1 个答案:

答案 0 :(得分:0)

问题是您要向Object.prototype添加一个可枚举的属性,这将是"可见"在对象迭代期间,Mongoose似乎正在做(并且它使它需要调用的函数混淆)。

相反,您希望使用Object.defineProperty添加不可枚举的属性:

Object.defineProperty(Object.prototype, 'safeGet', {
  value : function(props, defaultValue) {
    console.log(this, props, defaultValue);
    if (typeof props === 'string') {
      props = props.split('.');
    }
    if (this === undefined || this === null) {
      return defaultValue;
    }
    if (props.length === 0) {
      return this;
    }
    return this.safeGet(props.slice(1), defaultValue);
  }
});

但是,如果您主要使用此方法来处理Mongoose对象/文档,则应考虑创建plugin