1)属性先查自身,没有再查构造函数的原型。2)在全局下声明的变量,有var声明的不可以被delete删除,无var声明的可以被delete删除。

发布时间 2023-11-15 23:32:35作者: 龙陌

以下代码执行后,a.x 和 b.x 的结果分别为()

function A(x){
  this.x = x;
}
A.prototype.x = 1;
 
function B(x){
  this.x = x;
}
B.prototype = new A();
var a = new A(2), b = new B(3);
delete b.x;

A
2, 3

B
2, 1

C
2, undefined

D
其他几项都不对

正确答案:C

对象a自身具有属性x,属性值为2,同时其原型对象上也有属性x,属性值为1;
对象b在初始化时,也是自身具有属性x,属性值为3,同时其原型对象为函数A的实例,同样具有属性x,由于没有传参,其属性x的值为undefined。
当使用delete b.x时,对象b自身的x属性被删除,但是其原型对象上的x属性不会被删除。
另外,根据对象属性查找的作用域链规则,访问对象属性时,会先查找对象自身的属性,如果不存在,才会继续在其原型对象上进行查找,故a.x的返回结果为2,b.x的返回结果为undefined,C选项正确。

b的prototype=new A,想错的可能都认为构造函数的x没有赋值就自动去原型下找,错了,

如果构造函数没有x才会去原型下找,

如果有x但是没有赋值,则是undefined,相当于x=undefined.就不会进入原型链了

JS的每一个function都有一个prototype属性 ,该属性指向一个普通的Object。
由这个function new出来的每一个实例都会带上一个__proto__的指针,指向prototype指向的那个Object。
当把类的方法放到function的prototype里的时候,该prototype对象就会添加一个新的属性,那么每个实例都会获得该类的方法。

这就是基本的封装。即类的属性在构造方法里定义,类的方法在prototype里添加。

那为什么在原型上添加的方***被类的对象引用呢?

因为JS首先在该对象上查找方法,如没有则会去原型上查找。直到查找到Object跟类。