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
。