PS: 原型,通常也称做
prototype
所有的函数都有一个属性叫做prototype,被称为函数原型。随便打,不管是构造函数Object、Number还是自己写的普通函数,都有这个函数原型。那这个函数原型呢,也就是prototype是一个普通的Object对象。
那默认情况下,这个prototype有一个属性,叫做constructor,它也是一个对象,对象存的肯定是个地址,那这个地址指向谁?指向的是构造函数本身。
就上图举个例子,add函数有个属性叫做prototype,这个属性是个对象,所以称为原型对象。原型对象里有个属性叫做constructor,它又指向这个add函数。
输出看一下结果:
function test() {}
console.log(test.prototype);
console.log(test.prototype.constructor);
console.log(test.prototype.constructor === test);

接下来看一个概念:隐式原型。
PS: 隐式原型,通常写成
__proto__
这个有两个 下划线 的变量都表示的是系统变量,不要轻易地去使用。
所有的对象都有一个属性叫做__proto__,被称之为隐式原型。!!只要是个对象,就有这个属性。
默认情况下,隐式原型指向 创建该对象的函数的原型。对象是通过new一个函数产生的,所以啊,这个对象的隐式原型指向的就是这个构造函数的原型。
const a = new Object();
console.log("a", a.__proto__ === Object.prototype);//true
- 例:
function test() {
if (Math.random() > 0.5) {
return {};
} else {
return [];
}
}
const obj = test();
现在需要得到创建这个obj对象的构造函数的名称。通过前面的了解,知道{}其实就是通过new Object产生的,所以这两个构造函数就是Object和Array。
//obj.__proto__指向构造函数的原型,原型的constructor又指向构造函数
const name = obj.__proto__.constructor.name;