之前大神说,学习 JS 遇到原型和继承果断的跳过吧,没有它们,你也可以把 JS 玩的很 6
突然入了坑,简单的记录一下
构造函数
实例对象
用来初始化新创建的对象的函数是构造函数。
在 C++ 语言中,类 有一个构造函数, 它与类同名且没有返回值的(可以不写,也可重载多个);
在 JS 中, 没有 类 的概念,原型对象 姑且等同于 类 ,原型对象有 constructor 属性,该属性指向原型对象的构造函数。 JS 中默认存在的一些原型对象,也存在它们的构造函数,比如 Object() Array() Function() String() Number() Boolean() 等。
通过构造函数可以实例化多个对象,它们称为实例对象,且他们拥有相同的原型对象。 可以通过原型对象来实现 继承。
prototype
构造函数有 prototype 属性, 指向实例对象的原型对象。 同一构造函数实例化的不同实例对象指向相同的原型对象。 在 prototype 下定义的方法 有点像 C++ 里的在 类
constructor
原型对象有 constructor 属性,指向该原型对象的构造函数。
由于实例继承自原型对象,所以也拥有 constructor 属性, 指向原型对象的构造函数。
一句话,他们的指向完全相同
__proto__
实例对象有 __protp__ 属性,指向该实例对象对应的原型对象。 也可以理解为 父级对象 吧
构造函数也有 __proto__ 属性。constructor 下的 __proto__ 是指向 Function() 的,说到底构造函数也是一个稍特殊的函数(比普通函数多一个 prototype)
举个栗子:
constructor、prototype、__ptoto__
(3)[1,2,3] 是一个长度为 3 的数组,也是一个实例对象
1 这个实例对象对应的原型对象(__protp__)是 Array(0)
2 这个原型对象有 constructor 属性,指向该原型对象的构造函数 f Array() 1、f 代表是个函数 ;2、Array() 构造函数。 实例对象因为继承也拥有 constructor 属性。
3 这个构造函数有 prototype 属性,指向实例对象对应的原型对象,也就是 Array(0)
4 综合 1 3 可得:实例对象对应的原型对象 === 实例对象对应的原型对象的构造函数的原型对象,hiahiahia..... 这么一来,在原型对象的 constructor 属性下的 prototype 属性下会看到无限的自我循环。 prototype 属性 指向的原型对象有 constructor 属性, constructor 属性指向的构造函数 有 prototype 属性, prototype 属性指向的原型对象有 constructor 属性......
var arr = new Array(); console.log(Array.prototype.constructor === Array); // true 原型对象的 constructor 属性指向 console.log(arr.constructor === Array); // true 实例对象的 constructor 属性指向
这么说吧:
constructor 指向的是构造函数
prototype 和 __protp__ 指向的都是原型对象。前者指向自己,后者指向父级。
绕口令一般的..........
希望不是误导..........
原文地址:https://www.cnblogs.com/yier0705/p/8203284.html