本题考察了构造函数与实例对象的关系、查找原型链的时机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function A(){
this.x='hello'
}
A.prototype.x='world'

const a=new A();

a.x='what'
console.log(a.x);

delete a.x;
console.log(a.x);

delete a.x;
console.log(a.x);

a.x=undefined;
console.log(a.x);

//what
//world
//world
//undefined首先要理解,构造函数中的this.x和a.x有什么区别?其实就是相同的,在构造完毕之后,this被绑定在了实例对象a上面。

所以在不进行任何操作时,仅仅生成实例对象a并打印a.x输出的结果是’hello’

对四个a.x的操作逐行分析:

第一个a.x:修改之后打印修改后的值【’what’】
第二个,删除a.x:删除此时a实例对象上的x属性,此时a.x访问不到有效属性,因此从原型链上找是否有可继承的同名属性【’world’】
第三个,删除a.x:注意一个 重点delete只会删除当前对象的属性而不会沿着原型链查找,所以无法删除prototype上的x ,而且delete删除空属性不会报错。所以最后打印出来还是继承属性的值【’world’】
第四个a.x:a.x设置为了undefined【’undefined’】