前段时间我使用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
时不需要太多经验。
到目前为止,这一直很好。我无法看到代码中其他位置的变化如何影响这一点。
答案 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中压倒性的约定是构造函数名称最初是上限的。所以可能是SLDialog
或Sldialog
或SlDialog
而不是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(){ (..) },
};
这样,您可以确保维护原型对构造函数的反向链接。