题目
function A() {
this.do=function() {return ‘foo’;};
}
A.prototype=function() {
this.do=function() {return ‘bar’};
};
var x=new A().do();
求x的值
最后答案是foo
分析
一开始我以为是实例对象上不存在的属性和方法才会去原型上查找这个原因,后来查了一下发现是原型被重写的原因。
重写原型之后constructor不再指向构造函数本身,重写之后新构造的实例对象原型指向重写的原型。
下面我们看一下正常的情况
function Person(name){
this.name = name;
}
Person.prototype.sayHi = function(){
alert("Hi");
}
console.log(Person.prototype);
返回
- sayHi:function()
- constructor:function Person(name)
重写原型
function Person(name){
this.name = name;
}
Person.prototype = {
sayHi: function(){ alert("Hi"); }
}
console.log(Person.prototype);
返回
- sayHi:function()
解析
回到一开始的题目
function A() {
this.do=function() {return ‘foo’;};
}
A.prototype=function() {
this.do=function() {return ‘bar’};
};
var x=new A().do();
当A.prototype=function(){}这个时候已经对原型进行重写。
我们可以试试
function A() {
this.doing=function() {return ‘foo’;}; //修改了此处
}
A.prototype=function() {
this.do=function() {return ‘bar’};
};
var x=new A().do();
会发现直接报do is not a function。
所以这题输出foo并不是因为实例对象上不存在的属性和方法才会去原型上查找这个原因。
这题出得有点怪怪,看上去想考原型重写,结果并没有。