Javascript 函数重写原型(prototype)

标签 javascript oop function object prototype

我在 SO 上发现了一些有趣的例子。其中包括指向此 article 的链接. 据说:

Function.__proto__ points to Function.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/

相关文章:

javascript - 如何将焦点设置为在循环中动态创建的渲染 redux 表单

javascript - 如何门面(代理)websocket 端口

javascript - 日期格式为 utc 月份日期和年份(MMM DD、YYYY)

java - 从父类(super class)继承构造函数?

python - Numba jitclass : parent class type as a class member

python - 何时使用 python 函数 expm1 而不是 exp-1

javascript - 使用 Google Geocoding API 将命名实体识别标记文件链接到 Google map

c++ - 在没有动态转换或静态向下转换的情况下比较 C++ 中的派生类

查找素数的Python函数

java - Java 如何选择调用哪个重载函数?