带着问题,了解原型链

const a = 1;
console.log(a.__proto__ === Number.prototype); // true
console.log(a instanceof Number); // fasle

具体解释:

1>const a = 1;     a是一个原始值,类型为number

当你访问 a.__proto__ 时,JavaScript 会临时将 a 转换为 Number 对象,然后访问它的 proto 属性。因此,a.__proto__ 指向 Number.prototype

a.__proto__ === Number.prototype , a.__proto__ 指向 Number.prototype,因为 a 被临时转换为 Number 对象,而 Number 对象的原型是 Number.prototype

2> a instanceof Numberfalse

instanceof 运算符用于检查一个对象是否是某个构造函数的实例。它的工作原理是:检查对象的原型链中是否存在该构造函数的 prototype 属性。

  • a 是一个原始值,不是对象。

  • instanceof 只能用于对象,不能用于原始值。

console.log(a instanceof Number); // 输出: false

即使 a 被临时转换为 Number 对象,instanceof 也不会将其视为 Number 的实例,因为 a 本质上仍然是原始值。

解释instanceof

const numObj = new Number(1);

console.log(numObj instanceof Number); // 输出: true

  • numObj 是通过 new Number(1) 创建的对象,它的 proto 指向 Number.prototype

  • 因此,numObj instanceof Numbertrue

但对于原始值 a,它并不是通过 new Number() 创建的对象,所以 a instanceof Numberfalse

举例:

const a = 1;

// 1. a 是原始值,不是对象
console.log(typeof a); // 输出: "number"

// 2. 访问 a.__proto__ 时,临时转换为 Number 对象
console.log(a.__proto__ === Number.prototype); // 输出: true

// 3. a 不是 Number 的实例,因为它是原始值
console.log(a instanceof Number); // 输出: false

// 4. 创建一个 Number 对象
const numObj = new Number(1);
console.log(numObj instanceof Number); // 输出: true

番外知识点:

看到了上面的题目,想着了解一下这个的原理

Prototype 、_ _proto_ _

function PerSon(){}

Var a = new PerSon(); //创键实例对象,a 是一个对象

1.逐步深入理解 prototype__proto__ 这两个概念。

1. JavaScript 中的对象和原型链

在 JavaScript 中,几乎所有的东西都是对象。每个对象都有一个内部属性 [[Prototype]],这个属性指向另一个对象,我们称之为“原型”。原型对象也有自己的原型,这样就形成了一条链,称为“原型链”。

2. prototype 属性

prototype 是一个函数对象的属性。只有函数对象才有 prototype 属性。当你创建一个函数时,JavaScript 会自动为该函数创建一个 prototype 对象。

Person.prototype 是一个对象,它包含了一个 constructor 属性,指向 Person 函数本身。

3. __proto__ 属性

__proto__ 是每个对象都有的一个属性,它指向该对象的原型。__proto__ 是对象内部 [[Prototype]] 属性的一个 getter/setter。

这里,person 是通过 new Person() 创建的,所以 person.__proto__ 指向 Person.prototype

4. 原型链

当你访问一个对象的属性或方法时,JavaScript 会首先在对象本身查找,如果找不到,就会沿着原型链向上查找,直到找到该属性或方法,或者到达原型链的顶端(null)。

在这个例子中,person 对象本身没有 sayHello 方法,但它的原型 Person.prototype 上有这个方法,所以 JavaScript 会沿着原型链找到并调用它。

5. prototype__proto__ 的关系

  • prototype 是函数对象的属性,用于定义该函数的实例对象的原型。

  • __proto__ 是实例对象的属性,指向该对象的原型。

在这个例子中,Animal.prototypedog 对象的原型,所以 dog.__proto__ 指向 Animal.prototype

6. 原型链的顶端

所有对象的原型链最终都会指向 Object.prototype,而 Object.prototype 的原型是 null

  • prototype 是函数对象的属性,用于定义该函数的实例对象的原型。

  • __proto__ 是实例对象的属性,指向该对象的原型。

2.深入探讨 Person.prototype.__proto__Object.prototype 的由来,以及它们之间的关系。

1. Person.prototype 的由来

在 JavaScript 中,**函数是对象**。当你定义一个函数时,JavaScript 会自动为该函数创建一个 prototype 属性。这个 prototype 属性是一个对象,称为“原型对象”。

function Person() {}

console.log(Person.prototype); // 输出: {}
  • Person.prototype 是一个对象,它默认有一个 constructor 属性,指向 Person 函数本身。

  • Person.prototype 的作用是:当通过 new Person() 创建实例时,实例的 __proto__ 会指向 Person.prototype

const person = new Person();

console.log(person.__proto__ === Person.prototype); // 输出: true

2. Person.prototype.__proto__ 的由来

Person.prototype 本身也是一个对象,而**所有对象都有 ****__proto__**** 属性**,指向它的原型。

  • Person.prototype 是一个普通对象,它的 __proto__ 指向 Object.prototype

  • 这是因为 Person.prototype 是通过 Object 构造函数创建的(默认情况下)。

const person = new Person();

console.log(person.__proto__ === Person.prototype); // 输出: true

3. Object.prototype 的由来

Object.prototype 是 JavaScript 中所有对象的**最终原型**。它是原型链的顶端。

  • Object 是 JavaScript 中的一个内置构造函数。

  • Object.prototype 是一个对象,它是所有对象的原型(除了 null)。

  • Object.prototype 本身没有原型,它的 __proto__null

console.log(Object.prototype.__proto__); // 输出: null

4. 原型链的完整关系

function Person() {}


// 1. Person.prototype 是一个对象,由 JavaScript 自动创建

console.log(Person.prototype); // 输出: { constructor: Person }


// 2. Person.prototype.__proto__ 指向 Object.prototype

console.log(Person.prototype.__proto__ === Object.prototype); // 输出: true


// 3. Object.prototype 是原型链的顶端,它的 proto 是 null

console.log(Object.prototype.__proto__); // 输出: null


// 4. 实例对象的 proto 指向构造函数的 prototype

const person = new Person();

console.log(person.__proto__ === Person.prototype); // 输出: true

5. 图解原型链

用图来表示这些关系会更清晰:

person (实例对象)

|

| __proto__

v

Person.prototype

|

| __proto__

v

Object.prototype

|

| __proto__

v

null

  • personPerson 的实例,它的 __proto__ 指向 Person.prototype

  • Person.prototype 是一个对象,它的 __proto__ 指向 Object.prototype

  • Object.prototype 是原型链的顶端,它的 __proto__null

6. 为什么 Person.prototype.__proto__ 指向 Object.prototype

这是因为 Person.prototype 是一个普通对象,而**所有普通对象默认都是由 ****Object**** 构造函数创建的**。因此,Person.prototype 的原型是 Object.prototype

console.log(Person.prototype instanceof Object); // 输出: true

7. 总结

  • Person.prototype 是由 JavaScript 自动创建的原型对象,用于存储共享属性和方法。

  • Person.prototype.__proto__ 指向 Object.prototype,因为 Person.prototype 是一个普通对象,而普通对象的原型是 Object.prototype

  • Object.prototype 是原型链的顶端,它的 __proto__null

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值