一道基础例题的思考

     今天在网上查看Javascript面向对象编程相关文章时,看到了一个让我下意识判断错误的例题,虽然原理很简单,但还是记录下来,供日后工作和广大Javascript学习者查询。

<script type="text/javascript">
function A(){
	this.a="a";
}
A.prototype.b="b";
A.prototype.getA=function(){
	return this.a;
}
function B(){
	this.c="c";
}
B.prototype=new A();
B.prototype.constructor=B;
var b=new B();
var a=new A();
console.log(b.constructor==B);
console.log(a.constructor==B);
console.log(b instanceof B);
console.log(b instanceof A);
console.log(b instanceof Object);
</script>

上面是一段我自己编写的代码,具体问题是写出console.log的值,其中我的下意识的判断:

console.log(a.constructor==B); //true

理由是B.prototype.contructor重写了A.prototype对象contructor属性,运行以上代码:

运行结果证明我的下意思判断是错误,B.prototype.contructor并没有重写了A.prototype对象contructor属性,而是为B.prototype对象(即实例化的A对象)添加了contructor属性。总的来说我犯了一个低级的错误:

虽然可以通过对象实例访问保存在原型中的值,但却不能通过对象实例重写原型中的值。如果我们在实例中添加了一个属性,而该属性与实例原型中的属性同名,那我们就在实例中创建该属性,该属性将会屏蔽原型中的那个属性。使用delete操作符可以完全删除实例属性,而不能删除原型中的属性。所以原型中的属性对实例对象来说是只读的。

转载于:https://www.cnblogs.com/iRavior/archive/2012/12/05/2802828.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值