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