关于动态原型方法绑定的一些问题《JavaScript高级程序设计》?
本文介绍了关于动态原型方法绑定的一些问题《JavaScript高级程序设计》?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
两端代码,不同的地方在于Triangle.prototype = new Polygon();放置位置不同
第一段代码:
function Polygon(iSides){
this.sides = iSides;
if(typeof Polygon._initialized == 'undefined'){
Polygon.prototype.getArea = function() {
return 0;
};
Polygon._initialized = true;
}
}
function Triangle(iBase,iHeight){
Polygon.call(this,3);
this.base = iBase;
this.height = iHeight;
if(typeof Triangle._initialized == 'undefined'){
Triangle.prototype = new Polygon();//这里不同*******
Triangle.prototype.getArea = function(){
return 0.5*this.base*this.height;
}
Triangle._initialized = true;
}
}
var a =new Polygon(3);
var b =new Triangle(4,5);
var c =new Triangle(6,7);
console.log(a);
console.log(b);
console.log(c);
输出结果如下图所示:
第一个实例化的Triangle()没有绑定原型方法
第二段代码:
function Polygon(iSides){
this.sides = iSides;
if(typeof Polygon._initialized == 'undefined'){
Polygon.prototype.getArea = function() {
return 0;
};
Polygon._initialized = true;
}
}
function Triangle(iBase,iHeight){
Polygon.call(this,3);
this.base = iBase;
this.height = iHeight;
if(typeof Triangle._initialized == 'undefined'){
Triangle.prototype.getArea = function(){
return 0.5*this.base*this.height;
}
Triangle._initialized = true;
}
}
Triangle.prototype = new Polygon();//移动到了这里*******
var a =new Polygon(3);
var b =new Triangle(4,5);
var c =new Triangle(6,7);
console.log(a);
console.log(b);
console.log(c);
输出结果如下图所示:
第一个实例化的Triangle()绑定了原型方法
两端代码的目的都是让Triangle使用动态原型方法继承Polygon,我认为第一个实例化的Triangle()能够绑定原型方法,但结果却不是,书上说,
在代码运行前,对象已被实例化,并与原始的prototype对象联系在一起了。虽然用极晚绑定可使对原型对象的修改正确地反映出来,但替换prototype对象却不会对该对象产生任何影响。 只要未来的对象实例才会反映出这种改变,这就使第一个实例变得不正确。 (《JavaScript高级程序设计》100页)
这里的 在代码运行前,对象已经被实例化又是什么意思,为什么第一个实例会不正确呢。。。?
不明白书上说的在代码
解决方案
你想想,生成对象(或者叫实例化)是通过构造函数来完成的,在调用构造函数的时候,一开始就选用了之前的原型,所以这次调用产生的对象绑定的是原来的原型。新的原型是在构造函数中绑定的,已经不能用在当次实例化的时候,只能在下次实例化的时候起作用了。
一般情况下,不会有人把处理原型的事情放在构造函数里来进行。这段代码的出现,也只是为了说清楚晚绑定吧。
这篇关于关于动态原型方法绑定的一些问题《JavaScript高级程序设计》?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文