为什么我得到这个.set.Data不是一个函数'在我的原型功能?

时间:2015-09-04 09:57:08

标签: javascript prototype

前段时间我使用Prototype创建了对话功能。代码如下所示:

//Dialog constructor
var sldialog = function(params, callback){
    this.box         = // (...)
    this.background  = // (...)
    this.buttonPanel = // (...)
    this.callback    = callback;
    this.options     = $.extend({
     // (...)
    },params);

    this.setData();
    this.showDialog();
    this.dialogboxAction();
};

// Dialog functions
sldialog.prototype = {
    setData: function(){ (..) },
    showDialog: function(){ (..) },
    dialogboxAction: function(){ (..) },
};

我使用以下代码调用该函数:

    sldialog({
        title: 'Delete peprson',
        msg: 'Do you really want to delete this person?',
        type: 'action',
        yes: 'Delete person',
        multiDialog: 1
    }, function (confirmed) {
      // (...)
    });

现在我收到了错误:this.setData is not a function 通过查看一些教程,我在使用prototype时不需要太多经验。

到目前为止,这一直很好。我无法看到代码中其他位置的变化如何影响这一点。

1 个答案:

答案 0 :(得分:1)

您的sldialog函数是构造函数函数;你通过new调用构造函数。因此,您需要将其添加到您调用它的位置:

new sldialog({
    title: 'Delete peprson',
    msg: 'Do you really want to delete this person?',
    type: 'action',
    yes: 'Delete person',
    multiDialog: 1
}, function (confirmed) {
  // (...)
});

原因是即使我们称它们为#34;构造函数,"它不是创建对象的函数,而是new运算符。 new创建对象,分配原型,然后使用引用新对象的this调用构造函数。

旁注:JavaScript中压倒性的约定是构造函数名称最初是上限的。所以可能是SLDialogSldialogSlDialog而不是sldialog

附注2:一般情况下,我不鼓励人们替换函数的prototype属性所指向的对象;相反,我建议只添加它:

sldialog.prototype.setData = function() { ... };
sldialog.prototype.showDialog = function() { ... };
sldialog.prototype.dialogboxAction = function() { ... };

(是的,它会重复,所以我通常有一个复制属性的功能。)

如果你愿意,你可以继续替换它;只需确保将constructor设置回旧对象上的默认值:

sldialog.prototype = {
    constructor: sldialog,              // <===
    setData: function(){ (..) },
    showDialog: function(){ (..) },
    dialogboxAction: function(){ (..) },
};

这样,您可以确保维护原型对构造函数的反向链接。