基础-原型与原型链的纠葛(2)

56 阅读1分钟

PS: 原型,通常也称做 prototype

所有的函数都有一个属性叫做prototype,被称为函数原型。随便打,不管是构造函数ObjectNumber还是自己写的普通函数,都有这个函数原型。那这个函数原型呢,也就是prototype是一个普通的Object对象。

那默认情况下,这个prototype有一个属性,叫做constructor,它也是一个对象,对象存的肯定是个地址,那这个地址指向谁?指向的是构造函数本身。

image.png 就上图举个例子,add函数有个属性叫做prototype,这个属性是个对象,所以称为原型对象原型对象里有个属性叫做constructor,它又指向这个add函数。

输出看一下结果:

function test() {}
console.log(test.prototype);
console.log(test.prototype.constructor);
console.log(test.prototype.constructor === test);

image.png

接下来看一个概念:隐式原型

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产生的,所以这两个构造函数就是ObjectArray

//obj.__proto__指向构造函数的原型,原型的constructor又指向构造函数
const name = obj.__proto__.constructor.name;