constructor, prototype 很让人蒙逼

2019-07-18 23:47:00 +08:00
 lbfeng
function A(a) {
  this.a = a;
}

console.log(A.constructor);  // function Function() { [native code] }
console.log(A.prototype);    // {}
console.log(A.prototype.constructor);  // function A(a){this.a=a;}

let a = new A(1);

console.log(a.__proto__)     // {}
console.log(a.constructor);  // function A(a){this.a=a;}

A.prototype 是 Object, Object 的 constructor 居然是 A。实在不能理解

3135 次点击
所在节点    JavaScript
7 条回复
yuanfnadi
2019-07-18 23:54:11 +08:00
只要创建了一个函数,那么该函数会有一个 `prototype` 的属性,这个属性指向函数的原型对象。
所有原型对象都会有自动获得一个 `constructor` 的属性。这个属性包含一个指向 `prototype` 属性所在函数的指针。、

function Person() {
}

console.log(Person.prototype.constructor === Person) //true


创建自定义构造函数,其原型对象只会取得 `constructor` 属性,其他方法都是由 Object 继承而来。每当调用构造函数创建一个新实例后,该实例都将包含一个指针,指向构造函数的原型对象。在 `ECMA-262` 第 5 版中管这个指针叫 `[[Prototype]]`,在 Firefox Safari Chrome,每一个对象都支持一个属性 `__proto__`。
yuanfnadi
2019-07-18 23:55:32 +08:00
来自于 JavaScript 高级程序设计 6.2.3 原型模式
lbfeng
2019-07-19 05:17:46 +08:00
@yuanfnadi 好书,就是内容太多了。得抽空好好读下。
marcong95
2019-07-19 09:55:10 +08:00
因为你没往 A.prototype 上面挂东西,那 A.prototype、a.__proto__自然就是个{}
然后 a 是 new A(1)产生的,所以 A 是 a 的 constructor 也挺顺理成章的。
JS 的 new 运算符后面跟的是一个 Function,表示以这个 Function 作为 constructor 创建一个对象。
Yokira
2019-07-19 13:45:53 +08:00
推荐一个老哥讲解 JS 原型和闭包相关的文章,很详细,https://www.cnblogs.com/wangfupeng1988/p/3977924.html
MinonHeart
2019-07-25 17:03:43 +08:00
Office365
2023-10-18 10:17:48 +08:00
「 A.prototype 是 Object, Object 的 constructor 居然是 A 。实在不能理解」

请重看教材: https://javascript.info/function-prototype

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/584262

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX