你如何在JavaScript中创建一个实例的实例

我想制作一组不同人可以拥有的汽车的独特实例。 这些汽车将拥有类似的基本规格,但其中一些属性和方法会有所不同。

我的问题是我无法弄清楚这应该如何工作。 你如何处理或创建JavaScript实例实例?

var Car = function(make, country) {
    this.make = make;
    this.country = country;
};

var Ferrari = new Car('Ferrari', 'Italy');

var fred = new Person() {};
var fred.cars['Ferrari'] = new Ferrari(1200, 300000);

这会导致此错误,原因很明显。 我知道这不是一个构造函数(见下文)。

Uncaught TypeError: Ferrari is not a constructor

我正在寻找的是这样的。 法拉利的每一个不同的实例都会有不同的价格和milage。

var Ferrari = function(currentPrice, miles) }
    this.currentPrice = currentPrice;
    this.miles = miles;
    // this is an instance of car, aka it needs the result of this:
    // new Car('Ferrari', 'Italy');

};

弗雷德的法拉利是法拉利的一个例子,这是一个汽车的例子。 问题是,我想不出一种方法来构造一个构造函数来构造一个构造函数。 有没有办法做到这一点,或者我只是以错误的方式解决这个问题?

其他说明:

我知道我基本上可以让每种类型的汽车都成为一个静态类JSON对象,然后创建实例并添加新的唯一值。 但是,我希望能够将Car作为构造器,以便在需要时可以轻松制作更多。

我显然在这里错过了对OOP或JavaScript的一些理解,但如果有人能指引我朝着正确的方向,那将是非常棒的。


你要找的是派生的构造函数和相关的原型,有时称为子类。

在老式的ES5中,它看起来像这样:

var Car = function(make, country) {
    this.make = make;
    this.country = country;
};
var Ferrari = function(currentPrice, miles) {
    Car.call(this, "Ferrari", "Italy");
    this.currentPrice = currentPrice;
    this.miles = miles;
};
Ferrari.prototype = Object.create(Car.prototype);
Ferrari.prototype.constructor = Ferrari;

这是如何工作的:

  • Ferrari是一个构造函数,调用它时,调用Carthis指的是新的实例,用参数一起Car需求。 Car会在实例上设置这些属性。 然后我们继续使用Ferrari的代码,它将传入的参数和(在上面)记住它们作为属性。

  • 我们确保将由new Ferrari (取自Ferrari.prototype )分配给实例的对象使用Car.prototype作为其原型对象,以便如果您将事物添加到Car.prototype ,它们将出现在Ferrari也是如此。

  • 我们确保Ferrari.prototype的标准constructor属性是指Ferrari

  • 在ES2015中更好(今天你可以通过编译使用,比如像Babel这样的工具):

    class Car {
        constructor(make, country) {
            this.make = make;
            this.country = country;
        }
    }
    class Ferrari extends Car {
        constructor(currentPrice, miles) {
            super("Ferrari", "Italy");
            this.currentPrice = currentPrice;
            this.miles = miles;
        }
    }
    

    如果你想让Car实例成为构造函数, Car必须返回一个构造函数。

    问题是,它将继承自Function.prototype而不是Car.prototype 。 如果这是不可取的,请使用Object.setProtetypeOf来修复它:

    function Person() {
      this.cars = {};
    }
    function Car(make, country) {
      var instance = function(currentPrice, miles) {
        this.currentPrice = currentPrice;
        this.miles = miles;
      };
      instance.make = make;
      instance.country = country;
      Object.setPrototypeOf(instance, Car.prototype); // slow!!
      return instance;
    }
    var Ferrari = new Car('Ferrari', 'Italy');
    var fred = new Person();
    fred.cars.ferrari = new Ferrari(1200, 300000);
    

    或者,您可以添加一个将用于“实例化”实例的方法。

    function Person() {
      this.cars = {};
    }
    function Car(make, country) {
      this.make = make;
      this.country = country;
    }
    Car.prototype.instantiate = function(currentPrice, miles) {
      var instance = Object.create(this);
      instance.currentPrice = currentPrice;
      instance.miles = miles;
      return instance;
    };
    var ferrari = new Car('Ferrari', 'Italy');
    var fred = new Person();
    fred.cars.ferrari = ferrari.instantiate(1200, 300000);
    
    链接地址: http://www.djcxy.com/p/91423.html

    上一篇: How do you create an instance of an instance in JavaScript

    下一篇: Automatically append docker container to upstream config of nginx load balancer