我正在学习Javascript,最近我学到了一些关于原型的知识。我对原型的理解是,它们实际上是内存中的对象,每个新创建的对象都有一个指针。创建新对象时,用于创建该对象的构造函数将新创建的对象的原型指定为构造函数的原型。换句话说,如果我有一个圆圈构造函数,并且我创建了一个新的循环对象,那么这个新对象和圆圈构造函数都指向相同的引用。
我的问题是:如果原型应该引用创建对象的“父”对象,例如构造函数函数,为什么构造函数函数(即函数和对象)不指向“函数”构造函数作为它们的原型?如果您尝试创建像这样的新构造函数:
function Circle() {}
let c1 = new Circle();您将看到c1的原型如下所示,这是有意义的,因为圆圈构造器创建了它
Circle {}
__proto__:
constructor: ƒ Circle()
__proto__: ObjectCircle.prototype和上面的对象是相同的。那么,为什么Circle.prototype不把Function作为一个原型呢?
发布于 2020-03-31 16:37:59
正如您所观察到的,下面是true
Object.getPrototypeOf(c1) === Circle.prototype因此,从逻辑上讲,如果我们认为Circle是Function的一个实例,那么:
Object.getPrototypeOf(Circle) === Function.prototype您可以在下面确认这一点:
// let Circle = new Function(); /* also works here */
function Circle() {}
let c1 = new Circle();
console.log(Object.getPrototypeOf(c1) === Circle.prototype);
console.log(Object.getPrototypeOf(Circle) === Function.prototype);
Object.getPrototypeOf()方法返回指定对象的原型(即内部[[Prototype]]属性的值)。
这不应与Circle.prototype混淆。您可以在MDN关于对象原型的文章中更多地了解它们之间的区别,也可以随意浏览VS.JavaScript中的原型的任何答案。
请注意,Circle.__proto__和Object.getPrototypeOf(Circle)是等价的,但是__proto__是不标准的(尽管由于历史上对向后兼容性的使用,几乎每个JavaScript实现都定义了它)。
https://stackoverflow.com/questions/60955277
复制相似问题