我正在尝试在我的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
知道发生了什么事吗?更改名称无济于事。
答案 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。