Open cheqianxiao opened 5 years ago
let err = new TypeError() err instanceof TypeError // true (fine... err instanceof Error // true (fine... Error() instanceof TypeError // false (fine... Error() instanceof Error // true (wtf??? Object() instanceof Object // true Promise.resolve() instanceof Promise // true
Question:
Error() 为何会是 Error的instance?不加new应该是普通的函数调用啊,为何会是实例呢?不科学啊,难道内置的构造函数有什么魔力?
Answer:
The instanceof operator tests whether the prototype property of a constructor appears anywhere in the prototype chain of an object.
a instanceof A -> A.prototype是否出现在a的原型链上 -> a.__proto__是否指向A.prototype
a instanceof A
A.prototype
a.__proto__
let a = new A()时做的事情:
let a = new A()
prototype
a.__proto__ = A.prototype
this
恍然大雾:原来继承是通过对象的引用实现,然后控制只有上游可写,下游只能读。 所以:
function Foo(){} new Foo() 等价于 new Foo
所以:Error() instanceof Error 的一种合理解释:
Error() instanceof Error
function Error() { return Object.create(Error) }
关于Error: 除了Error还有其他7种内置的错误构造函数:EvalError、InternalError、RangeError、ReferenceError、SyntaxError、URIError、TypeError
EvalError
InternalError
RangeError
ReferenceError
SyntaxError
URIError
TypeError
Question:
Error() 为何会是 Error的instance?不加new应该是普通的函数调用啊,为何会是实例呢?不科学啊,难道内置的构造函数有什么魔力?
Answer:
a instanceof A
->A.prototype
是否出现在a的原型链上 ->a.__proto__
是否指向A.prototype
let a = new A()
时做的事情:prototype
属性(可读可写)即:a.__proto__ = A.prototype
this
指向刚创建的那个崭新的对象恍然大雾:原来继承是通过对象的引用实现,然后控制只有上游可写,下游只能读。 所以:
所以:
Error() instanceof Error
的一种合理解释:关于Error: 除了Error还有其他7种内置的错误构造函数:
EvalError
、InternalError
、RangeError
、ReferenceError
、SyntaxError
、URIError
、TypeError