3

我在 Javascript 中有一个名为 Booking 的自定义类:

function Booking(technicianID, startTime, start, street, zipcode, jobtypeID) {
    this.technicianID = technicianID;
    this.startTime = startTime;
    this.start = start;
    this.street = street;
    this.zipcode = zipcode;
    this.jobtypeID = jobtypeID;
}

我想使用这个类的一个对象作为函数的输入。

function bookTime(inputBooking) {
    var tmpBooking = inputBooking;
    alert("You chose: " + tmpBooking.start + ". Tech: " + tmpBooking.technicianID);
}

但由于某种原因,我从警报中得到的只是变量“未定义”。我猜这是因为它没有将 inputBooking 视为 Booking 对象,这意味着它没有变量 start 和 techn...

我读到有一个可以使用的 Object.create 函数,但我无法让它工作。

    tmpBooking = Object.create(Booking, inputBooking); 

关于如何解决这个问题的任何想法?

编辑:

如果我直接从 javascript 发送 inputBooking 对象,它会按预期工作。

    var tmpBooking = new Booking(tmpTechID, tmpStartTime, tmpStart, tmpStreet, tmpZipcode, tmpJobtypeID);

    bookTime(tmpBooking);
    //Works

但问题是我想将一个临时对象发送到 HTML 并生成一个将调用 bookTime 函数的按钮:

    var tmpBooking = new Booking(tmpTechID, tmpStartTime, tmpStart, tmpStreet, tmpZipcode, tmpJobtypeID);

    resultsHTML += "<a href=\"#\" onclick=\"bookTime('" + tmpBooking + "')\">Book!</a>";
    //Doesn't work

当我用调试器运行它时,它说 inputBooking 的类型是 [object Object] 并且“无法评估儿童”。结果是 start 和 TechnicalID 变量未定义。

4

2 回答 2

2

您显示的代码没有任何问题。如果您使用实际Booking对象调用该函数,它将按预期工作:

bookTime(new Booking('Tech1', 'Now', 'Now', 'Here', 'Zip', 'Job'));

演示:http: //jsfiddle.net/Guffa/fRmA2/

因此,您的问题很可能不是Booking您发送到函数中的对象。

编辑:

您正在创建包含对象字符串表示的 HTML 代码,但对象的字符串表示不能用于重新创建看起来相同的对象。

在代码中使用变量:

resultsHTML += "<a href=\"#\" onclick=\"bookTime(tmpBooking)\">Book!</a>";

或创建将创建对象的代码:

resultsHTML += "<a href=\"#\" onclick=\"bookTime(new Booking(tmpTechID, tmpStartTime, tmpStart, tmpStreet, tmpZipcode, tmpJobtypeID))\">Book!</a>";

但是,取决于您从哪里获取数据,或者您是否在循环中使用它,这些都可能不起作用。如果您使用的变量在全局范围内不可用,则需要使用每个变量的值来创建创建对象的代码。就像是:

resultsHTML += "<a href=\"#\" onclick=\"bookTime(new Booking('"+tmpTechID.replace(/\\/g,'\\\\').replace(/'/g,'\\'')+", '"+tmpStartTime.replace(/\\/g,'\\\\').replace(/'/g,'\\'')+", '"+tmpStart.replace(/\\/g,'\\\\').replace(/'/g,'\\'')+", '"+tmpStreet.replace(/\\/g,'\\\\').replace(/'/g,'\\'')+", '"+tmpZipcode.replace(/\\/g,'\\\\').replace(/'/g,'\\'')+", '"+tmpJobtypeID.replace(/\\/g,'\\\\').replace(/'/g,'\\'')+"))\">Book!</a>";
于 2012-08-13T08:41:12.130 回答
0

您很可能忘记在以下位置使用new关键字:

var inputBooking = new Booking(...
于 2012-08-13T08:40:42.953 回答