当我们在给原型增加多个属性的时候,如果重复输入Chenqiguo.prototype.xxx很多遍,那么代码就会显得比较臃肿,并且增加了代码开销,我们可以对原型使用字面量的方法来改善,例如下面这种情况:
Chenqiguo.prototype = {
getName:function(){
},
setNaem:function(){
},
delName:function(){
}
}
不幸的是,这样写出来的代码会有一些属性的隐式丢弃,例如constructor属性
//单独给Circle.prototype赋值
function Circle(radius){
this.radius = radius;
}
Circle.prototype.getName = function(){
return '123';
}
Circle.prototype.setName = function(){
return '123';
}
alert(Circle.prototype.constructor);//这里打印的原型上的constructor是Circle,此时它的构造函数指向了正确的Circle对象
//以对象字面量的方式给Circle.prototype赋值
function Circle(radius){
this.radius = radius;
}
Circle.prototype={
getName:function(){
return '123';
},
setName:function(){
return '123';
}
}
alert(Circle.prototype.constructor);//这里打印的是object,它的constructor不指向Circle对象了
第二种方法更符合开发人员的写法,不管从代码的美观程度还是对代码的实用程度来说都是如此。那么有没什么办法解决这个问题呢?通过以下方法可以解决这个问题
在原型字面量内部强制指定它的constrcutor属性为Circle对象,例如
function Circle(radius){
this.radius = radius;
}
Circle.prototype={
constructor:Circle,
getName:function(){
return '123';
},
setName:function(){
return '123';
}
}
alert(Circle.prototype.constructor);//这里又会打印它的constructor为Circle
Chenqiguo.prototype = {
getName:function(){
},
setNaem:function(){
},
delName:function(){
}
}
不幸的是,这样写出来的代码会有一些属性的隐式丢弃,例如constructor属性
当我们在给Chenqiguo.prototype赋以新值的时候,javascript将不再为该对象创建constructor属性。这表示对constructor属性的[[get]]会引发解释器沿着原型链查找,直至找到相应的值。在我们现在的这个构造器中,constructor属性查找的是object.prototype,而后者的constructor属性值是Object
//单独给Circle.prototype赋值
function Circle(radius){
this.radius = radius;
}
Circle.prototype.getName = function(){
return '123';
}
Circle.prototype.setName = function(){
return '123';
}
alert(Circle.prototype.constructor);//这里打印的原型上的constructor是Circle,此时它的构造函数指向了正确的Circle对象
//以对象字面量的方式给Circle.prototype赋值
function Circle(radius){
this.radius = radius;
}
Circle.prototype={
getName:function(){
return '123';
},
setName:function(){
return '123';
}
}
alert(Circle.prototype.constructor);//这里打印的是object,它的constructor不指向Circle对象了
第二种方法更符合开发人员的写法,不管从代码的美观程度还是对代码的实用程度来说都是如此。那么有没什么办法解决这个问题呢?通过以下方法可以解决这个问题
在原型字面量内部强制指定它的constrcutor属性为Circle对象,例如
function Circle(radius){
this.radius = radius;
}
Circle.prototype={
constructor:Circle,
getName:function(){
return '123';
},
setName:function(){
return '123';
}
}
alert(Circle.prototype.constructor);//这里又会打印它的constructor为Circle