Javascript 需要使用继承、实例和原型打印对象的形状
我需要在构造函数Javascript 需要使用继承、实例和原型打印对象的形状,javascript,node.js,Javascript,Node.js,我需要在构造函数shape()中打印对象的形状,其中“三角形”和“正方形”的实例继承shape()构造函数。然后我在Shape()中调用一个名为get\u type的方法来显示形状类型 函数形状(){ this.type=''; this.get_type=函数(){ console.log(this.constructor) } } 函数三角形(s1、s2、s3){ 这1.side1=s1; 这1.2=s2; 这1.3=s3; } 功能方块(s1、s2、s3、s4){ 这1.side1=s1
shape()
中打印对象的形状,其中“三角形”和“正方形”的实例继承shape()
构造函数。然后我在Shape()
中调用一个名为get\u type
的方法来显示形状类型
函数形状(){
this.type='';
this.get_type=函数(){
console.log(this.constructor)
}
}
函数三角形(s1、s2、s3){
这1.side1=s1;
这1.2=s2;
这1.3=s3;
}
功能方块(s1、s2、s3、s4){
这1.side1=s1;
这1.2=s2;
这1.3=s3;
这一点4=s4;
}
var三角形=新三角形(10,8,15);
Triangle.prototype=新形状();
console.log(Triangle.prototype)//显示控制台上的Shape()函数。
log(triangle.side1,triangle.side2,triangle.side3)//显示三角形构造函数的工作原理。
console.log(triangle.type)//未定义
三角形。获取_type();//获取一个非函数错误。
在您已经使用该函数构造三角形对象之后,您正在设置三角形函数的原型。更改Triangle.prototype以引用新对象不会更改三角形的原型
将线
Triangle.prototype=new Shape()
移动到var Triangle=new Triangle(10,8,15)上方代码>如果希望三角形从形状继承方法和属性。在使用三角形函数构造三角形对象后,您正在设置三角形函数的原型。更改Triangle.prototype以引用新对象不会更改三角形的原型
将线Triangle.prototype=new Shape()
移动到var Triangle=new Triangle(10,8,15)上方代码>如果希望三角形从形状继承方法和属性。看起来您有几个问题:
您的get_type
函数应该添加到原型中,以避免为每个实例化的形状创建新方法
在使三角形
从形状
继承之前,不应调用新三角形
(通过设置Triangle.prototype=new Shape
)
您必须手动设置Triangle.prototype.constructor=Triangle
。(有关基本原理,请参见。)
函数形状(){
this.type=“”
}
Shape.prototype.get_type=函数(){
返回这个.constructor
}
函数三角形(s1、s2、s3){
this.type='triangle'
此参数为1=s1
此.side2=s2
此参数为3=s3
}
三角形。原型=新形状
Triangle.prototype.constructor=三角形
功能方块(s1、s2、s3、s4){
this.type='square'
这1.side1=s1;
这1.2=s2;
这1.3=s3;
这一点4=s4;
}
var三角形=新三角形(10,8,15)
console.log(Triangle.prototype)/=>[形状]
console.log(triangle.side1,triangle.side2,triangle.side3)/=>10,8,15
console.log(triangle.type);//=>'三角形'
console.log(triangle.get_type())/=>[函数三角形]
看起来您有几个问题:
您的get_type
函数应该添加到原型中,以避免为每个实例化的形状创建新方法
在使三角形
从形状
继承之前,不应调用新三角形
(通过设置Triangle.prototype=new Shape
)
您必须手动设置Triangle.prototype.constructor=Triangle
。(有关基本原理,请参见。)
函数形状(){
this.type=“”
}
Shape.prototype.get_type=函数(){
返回这个.constructor
}
函数三角形(s1、s2、s3){
this.type='triangle'
此参数为1=s1
此.side2=s2
此参数为3=s3
}
三角形。原型=新形状
Triangle.prototype.constructor=三角形
功能方块(s1、s2、s3、s4){
this.type='square'
这1.side1=s1;
这1.2=s2;
这1.3=s3;
这一点4=s4;
}
var三角形=新三角形(10,8,15)
console.log(Triangle.prototype)/=>[形状]
console.log(triangle.side1,triangle.side2,triangle.side3)/=>10,8,15
console.log(triangle.type);//=>'三角形'
console.log(triangle.get_type())/=>[Function triangle]
在对象已经初始化之后,您已经连接了原型。在创建三角形对象之前移动原型分配,将使您能够获取_类型
但是,由于您分配原型的方式,您无法获得实际构造函数函数名的引用。这种行为的主要原因是您实际创建了一个独立于构造函数的Shape对象实例,并将该实例引用为三角形/正方形的原型。当实例化三角形/正方形构造函数时,不会执行形状构造函数
要避开这个问题,您可以使用
您可以使用代码段作为参考
在代码段中,您可以看到正在对每个三角形/正方形对象实例化调用形状构造函数,现在,您可以根据实例将构造函数引用视为三角形/正方形
但是这种方法有其自身的缺点,因为您可以看到在Shape原型上定义的任何方法在Traiangle/Square上都不可用。为了实现这一点,如果您同意的话,您需要在shapeconstructor中使用您的方法,而不是使用prototype
函数形状(){
this.type='emptyString';
this.get_type=函数(){
console.log(this.constructor.name)
}
}
Shape.prototype.getSomeValue=函数(){
控制台日志(“1234”);
}
函数三角形(s1、s2、s3){
打电话给(这个);
这1.side1=s1;
这1.2=s2;
这1.3=s3;
}
功能方块(s1、s2、s3、s4){
打电话给(这个);
这1.side1=s1;
这1.2=s2;
这1.3=s3;
这一点4=s4;
}
var三角形=新三角形(10,8