以下代码执行后,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跟类。
标签:delete,对象,原型,var,new,prototype,声明,属性 From: https://www.cnblogs.com/longmo666/p/17835135.html