我在使用以下代码时遇到了一些问题:
command button
我为pickUpPassengers()添加了一个全局num_passengers,以避免它被取消定义。
但是,我仍然收到了总线实例的pickUpPassegers方法的NAN。
这是范围界定还是定义?
答案 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会更容易。如果你想创建多个总线,它也可以帮到你。)