2016-11-04 55 views
2

我有下面的代码,以确保Promise.reject返回一个实际的错误对象:使用的Object.create代替setPrototypeof

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

+1

为什么不使用[Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)? – ltamajs

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error –

+0

我可以使用新的错误,但这是一个学习练习 – dagda1

回答

1

这MDN链接特别说:

如果你关心性能,你应该避免设置对象的[[Prototype]]。相反,请使用Object.create()创建一个具有所需[[Prototype]]的新对象。

所以,与其让一个对象与文字表达{ 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)模式的众多示例。

1

设置prototypeError.prototype,设置message为对象,设定对象的valueerr.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));