JS:从超类实例创建子类实例

时间:2016-10-14 12:55:36

标签: javascript oop inheritance

我知道如何从超类原型创建子类原型。但是如果我已经有一个超类对象的实例来创建一个子类对象呢?

在JS中使用经典OOP的MDN示例:

// Shape - superclass
function Shape(x, y) {
    this.x = x;
    this.y = y;
}
// Rectangle - subclass
function Rectangle(x, y, w, h) {
    Shape.call(this, x, y); // call super constructor.
    this.w = w;
    this.h = h;
}
// subclass extends superclass
Rectangle.prototype = Object.create(Shape.prototype);
Rectangle.prototype.constructor = Rectangle;

如果我已经有一个形状实例并且我想基于它创建一个矩形怎么办?

function createSquareFromShape(shape) {
    var rect = new Rectangle(1, 1);
    rect = Object.create(shape);
    // rect gets the shape prototype but loses Rectangle
}

我知道我可以手动将属性从一个对象复制到另一个对象但是可能有更快更轻松的方法吗?

1 个答案:

答案 0 :(得分:-1)

Object.create返回一个新对象,其原型设置为您传入的任何对象,作为create方法的第一个参数。所以你用一个新对象覆盖你的rect变量。

您将无法从Shape对象创建Rectangle对象,因为Rectangle是Shape对象的特化,Shape不知道它是以哪种方式专门化。

如果你决定学习一个基于类的JavaScript风格,我会建议你的Shape“class”(对象)上的一个函数,它从它自己创建矩形。或者是一个可以接受Shape并返回一个Rectangle的工厂,沿着

var ShapeFactory = {
    CreateRectange: function(shape, w, h) {
        var rect = new Rectangle();
        rect.x = shape.x;
        rect.y = shape.y;
        rect.w = w;
        rect.h = h;
        return rect;
    }
}

var shape = new Shape(1,1);
var rect = ShapeFactory.CreateRectangle(shape, 1, 1);

我觉得我需要建议专门阅读本系列文章https://github.com/getify/You-Dont-Know-JS https://github.com/getify/You-Dont-Know-JS/tree/master/this%20%26%20object%20prototypes,并自行决定是否值得学习基于班级的模式(这可能是社区中一个非常极端的话题)