一道奇怪的题目(重写原型)

重写原型

题目

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);

返回

  1. sayHi:function()
  2. constructor:function Person(name)

重写原型

function Person(name){ 
	this.name = name;
 } 
Person.prototype = {
	sayHi: function(){ alert("Hi"); } 
}
console.log(Person.prototype);

返回

  1. 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并不是因为实例对象上不存在的属性和方法才会去原型上查找这个原因。
这题出得有点怪怪,看上去想考原型重写,结果并没有。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值