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 Number
为 false
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 Number
为true
。
但对于原始值 a
,它并不是通过 new Number()
创建的对象,所以 a instanceof Number
为 false
。
举例:
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.prototype
是 dog
对象的原型,所以 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
-
person
是Person
的实例,它的__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
。