Javascript:返回NAN的实例方法

时间:2016-06-08 16:31:13

标签: javascript methods javascript-objects nan

我在使用以下代码时遇到了一些问题:

command button

我为pickUpPassengers()添加了一个全局num_passengers,以避免它被取消定义。

但是,我仍然收到了总线实例的pickUpPassegers方法的NAN。

这是范围界定还是定义?

3 个答案:

答案 0 :(得分:1)

这是num_passengers定义的问题。 您应该在开头将其初始化为数字:

var num_passengers = 0;

但是,如果您想更改num_passengers对象bus的值,则应使用this并删除num_passengers的第一个定义:

bus.pickUpPassengers = function(toPickUp){
    this.num_passengers += toPickUp;
    return this.num_passengers;
}

答案 1 :(得分:1)

查找当前实例只是一个小问题。您只需要使用'this'来定义num_passengers所需的实例。

此外,这样您不需要num_passengers的全局变量,这意味着您可以同时拥有多个实例(汽车,公共汽车和摩托车)。这有可能避免将来出现问题。

function vehicleConstructor(name, num_wheels, num_passengers)
{
    var vehicle = {};
    vehicle.name = name;
    vehicle.num_wheels = num_wheels;
    vehicle.num_passengers = num_passengers;

    vehicle.makenoise = function() {

    }
    return vehicle;
}

var bus = vehicleConstructor("car", 5, 10);

bus.pickUpPassengers = function(toPickUp){
    this.num_passengers += toPickUp;
    return this.num_passengers;
} 

答案 2 :(得分:1)

以下是我编写代码的方法:

function Vehicle (name, options) {
  this.name = name
  this.wheels = options.wheels
  this.passengers = options.passengers
}

Vehicle.prototype.makeNoise = function () {
  console.log('vroom')
  return this
}

var bus = new Vehicle('bus', { wheels: 4, passengers: 10 })

bus.pickUpPassengers = function (toPickUp) {
  this.passengers += toPickUp
  return this
}

bus.pickUpPassengers(5)

这使用JavaScript的原型继承,可以像其他语言中的类一样使用。构造函数以大写字母开头(按惯例),并使用new调用。使用原型还意味着每次创建新车时都不会定义makeNoise之类的方法,而是所有车辆都会返回原型。

我还在方法的末尾使用了return this,因为它允许链接:

// Without chaining:
foo.bar()
foo.baz()
foo.qux()

// With chaining:
foo.bar().baz().qux()

Vehicle构造函数还会在选项对象中获取轮子和乘客的数量,这样可以更容易地阅读和理解数字的用途。

使用ES6,它看起来像这样:

class Vehicle {
  constructor (name, { wheels, passengers } = {}) {
    this.name = name
    this.wheels = options.wheels
    this.passengers = options.passengers
  }
  makeNoise () {
    console.log('vroom')
    return this
  }
}

class Bus extends Vehicle {
  constructor (options) {
    super('bus', options)
  }
  pickUpPassengers (toPickUp) {
    this.passengers += toPickUp
    return this
  }
}

const bus = new Bus({ wheels: 4, passengers: 10 })
bus.pickUpPassengers(10)

(这里我选择使Bus成为Vehicle的子类,因为使用ES6会更容易。如果你想创建多个总线,它也可以帮到你。)

相关问题