使用Object.create而不是setPrototypeof

时间:2016-11-04 17:14:08

标签: javascript javascript-objects

我有以下代码确保Promise.reject返回实际的错误对象:

export const rejectWithAnError = function(error) {
  if(error.constructor === Error) {
    return Promise.reject(error);
  }

  const err = { error: true, message: error };
  Object.setPrototypeOf(err, new Error());
  return Promise.reject(err);
};

然后我遇到了这个link,说使用Object.create会更好。

在这种情况下我如何使用Object.create

2 个答案:

答案 0 :(得分:1)

prototype设置为Error.prototype,将message设置为对象,将对象的value设置为当调用err.constructor时应显示的消息err.message作为参数。



var err = Object.create(Error.prototype, {
  message: {
    value: "error"
  },
  error: {
    value: true
  }
})

Promise.reject(err.constructor([err.message, err.error]))
  .then(data => console.log(data))
  .catch(e => console.log(e, e.message));




答案 1 :(得分:1)

MDN链接特别说:

  

如果您关心性能,则应避免设置对象的[[Prototype]]。而是使用[[Prototype]]创建一个包含所需Object.create()的新对象。

因此,您应该创建一个原型为{ error: true, message: error }的新对象,然后在其上设置属性,而不是使用文字表达式Error.prototype创建对象并更改其原型:

const err = Object.create(Error.prototype);
err.error = true;
err.message = error;

MDN's Object.create page上,您可以看到许多正在使用的Object.create(Foo.prototype)模式示例。