在JavaScript中,什么时候是访问的对象属性,什么时候访问的是原型上的属性值

在JavaScript中,什么时候是访问的对象属性,什么时候访问的是原型上的属性值?

function Foo(name, age) {
this.name = name;
this.age = age;
}

Foo.prototype.num = 12;

const foo = new Foo('张三', 12);

foo.num = 100;

console.log(Foo.prototype.num); // 12

为什么这里进行 foo.num = 100; 最终的结果是在foo实例对象上设置了num=100; 但是在原型上没有被修改?

可以帮忙解释一下这个吗?着实没有明白这个😂

你用 foo.num = 100 是设置实例 foo 的 num 属性,但是 Foo.prototype.num 属性是不变的,不会影响原型

在JavaScript中,当我们访问一个对象的属性时,如果该属性在对象本身上存在,则访问的是对象属性;如果该属性在对象本身上不存在,但是在原型链上存在,则访问的是原型上的属性值。如果该属性既不存在于对象本身上,也不存在于原型链上,则返回undefined。

例如,假设有一个对象obj,它的原型是proto,同时obj本身有一个属性name,而proto上也有一个属性age,那么当我们访问obj的name属性时,访问的是对象属性;当我们访问obj的age属性时,访问的是原型上的属性值。如果obj上既没有name属性,也没有age属性,那么访问obj.name和obj.age都会返回undefined。

解释一下例子

在 JavaScript 中,每个对象都有一个指向它的原型对象的内部链接,这个原型对象又有自己的原型,形成了一个原型链。当我们访问一个对象的属性时,JavaScript 引擎会先查找对象本身是否有该属性,如果没有,就会沿着原型链向上查找,直到找到该属性或者到达原型链的顶端(即 Object.prototype)。

在这个例子中,当我们访问 foo.num 时,JavaScript 引擎会先查找 foo 对象本身是否有 num 属性,发现有,就直接返回 foo.num 的值,即 100。而当我们访问 Foo.prototype.num 时,JavaScript 引擎会沿着原型链向上查找,最终找到 Foo.prototype 对象上的 num 属性,返回其值,即 12

当我们执行 foo.num = 100 时,JavaScript 引擎会先查找 foo 对象本身是否有 num 属性,发现没有,就会在 foo 对象上创建一个新的 num 属性,并将其值设置为 100。此时,foo 对象上的 num 属性会遮蔽原型链上的 num 属性,因此访问 foo.num 时会返回 100,但是原型链上的 num 属性仍然存在,访问 Foo.prototype.num 时会返回 12