如果前一个示例中的类以原型方式重新定义,则它们将被转换成以下形式:
复制代码代码如下所示:
函数的ClassA(){
}

classa.prototype.color =蓝色;
(classa.prototype.saycolor =功能){
警戒(这个颜色);
};

函数的ClassB(){
}

classb.prototype =新ClassA();

原型的魔法是最后一行的代码。在这里,B的原型属性设置为类的一个实例。这很有趣,因为你想要的类的所有属性和方法,但不想增加他们的B一原型之一。有没有更好的方法给一个原型属性比ClassA的实例吗

注:ClassA的构造函数被调用,它不传递参数给它。这是在原型链的标准做法。确保构造函数没有参数。

与对象伪装类似,子类的所有属性和方法都必须在原型属性被赋值之后出现,因为在它之前分配的所有方法都将被删除。为什么因为原型是一个新的对象所取代,原来的对象已被添加到新的方法将被破坏。所以,添加属性的B类和sayname代码()方法如下:
复制代码代码如下所示:
函数的ClassB(){
}

classb.prototype =新ClassA();

= B。原型名称;
(classb.prototype.sayname =功能){
警报(这个名字);
};

代码的这一部分可以通过运行以下示例来测试:
复制代码代码如下所示:
无功obja =新ClassA();
无功objb =新的B();
obja.color =蓝色;
objb.color =红色;
objb.name =约翰;
ObjA.sayColor();
ObjB.sayColor();
ObjB.sayName();

此外,在原型链的instanceof运算符的操作也是独一无二的。对于B的所有实例,实例返回ClassA和乙级。例如:
复制代码代码如下所示:
无功objb =新的B();
警报(objb instanceof ClassA); / /输出真
警报(objb是乙级); / /输出真

这是弱类型的世界用一个非常有用的工具,但它是不可能使用这种方法来判断一个对象时,是冒充的。但由于子类的原型是直接分配,情况如下:
复制代码代码如下所示:
console.log(objb。__proto__ = = = objb。构造函数。原型) / /假

由于对B的原型链的原型属性是由另一个类的对象重写。输出结果表明,objb。__proto__仍然指向ClassB.prototype,不objb.constructor.prototype.it也很好理解,作业person.prototype是一个新的(A)的直接对象的实例,使用对象构造函数的直接对象定义(构造函数)的构造函数是对象的根,Object.prototype是一个空的对象{ } { },性质和范围的classb.prototype。