我在 SO 上发现了一些有趣的例子。其中包括指向此 article 的链接. 据说:
Function.__proto__
points toFunction.prototype
. This results in:
Function.constructor === Function
That is to say: Function is it's own constructor!
Object instanceof Object == true.
这是因为:
Object.__proto__.__proto__.constructor == Object
Note also that unlike
Object instanceof Object
,Foo instanceof Foo == false
. This is because:Foo
does not exist as a constructor for it's own prototype chain.
从 Mozilla 开发者网络我发现原型(prototype)和构造函数都可以很容易地被覆盖。自 instanceof
只是检查原型(prototype)链中的 constructor.prototype
,我真的不明白为什么我的代码仍然返回 false
。
function Foo() { } ;
Foo.prototype = Foo
Foo.constructor = Foo
Foo instanceof Foo // still false
还有一些关于原型(prototype)的问题。我没看错吗,那个原型(prototype)本身是一个单独的辅助对象?这个对象就像指向另一个对象的指针 - 通常是 Object
。
最佳答案
obj instanceof
并不是在 obj.prototype
中寻找 constructor
,而是在对象的内部 __proto__
属性中寻找.
javascript 中的每个对象都有一个内部__proto__
属性,它引用对象的原型(prototype)。当使用 new
运算符构造对象时,该对象的内部 __proto__
属性将设置为构造函数的 prototype
属性。
因此,当您说 Foo instanceof Foo
时,javascript VM 将在 Foo.__proto__
中查找“Foo”。因为 Foo 是一个函数,所以 Foo.__proto__
是 Function.prototype
(其中 Function
是函数的构造函数)。
由于您实际上无法更改对象的内部 __proto__
属性,因此 Foo 永远不可能是 Foo 的实例。
关于你的小问题:在 javascript 中,一切都是对象。这包括原型(prototype) 和 函数。事实上,ECMAScript 5 添加了一个函数 Object.create
( MDN ),它将一个对象作为第一个参数,然后使用第一个对象作为其内部原型(prototype)对象创建一个新对象。
关于Javascript 函数重写原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15993578/