使用此代码:
function thing(){
function majig(){
alert("done");
}
}
var mything = new thing();
mything.majig();
我收到此错误: TypeError:mything.majig不是函数
我已经完成了一段时间的javascript,并且我已经将函数作为函数的一部分并且之前调用它们。我知道它必须是简单的我遗漏或遗忘,但各种网络搜索(并在这里探讨)让我得到更深层次的理论答案,或似乎表明这应该有效的例子。
我知道TypeError: foo 不是函数通常意味着语法错误。我查了一些示例,看起来就像我的语法正确一样(我尝试了一些变化而没有成功)。
这是一个愚蠢的简单错误,但我现在才抓住它。我的功能是如何使mything.majig();
正常运行?
答案 0 :(得分:3)
您已在thing
中声明了一项功能,但它根本没有附加到this
。试试这个:
function thing(){
this.majig = function() {
alert("done");
}
}
var mything = new thing();
mything.majig();
可替换地:
function thing() {
return {
majig: function() {
alert("done");
}
};
}
或者,更好的是:
function thing() { }
thing.prototype.majig = function () {
alert('done');
}
答案 1 :(得分:2)
语法不是您认为的意思。它不是会员声明。它是一种内在的功能。内部函数就像局部变量一样工作 - 它们只能在外部函数的范围内访问:
function foo () {
function bar () {}
bar(); // accessible here
}
bar(); // undefined here
如果你的函数是构造函数,那么要将一个成员函数添加到它构造的对象中,你将它添加到构造函数的原型中:
function Foo () {}
Foo.prototype.bar = function () {}; // bar is a member of object Foo
var f = new Foo();
f.bar(); // call member function
javascript中的对象是动态的。它们的行为更像是其他语言中的地图/哈希。这意味着您可以直接将成员函数添加到对象而不是构造函数的原型:
var f = {};
f.bar = function () {};
f.bar(); // call member function
遵循上面的逻辑,由于构造函数中的this
引用了正在构造的对象,因此您还可以动态地将函数添加到this
。这通常被称为"装饰"因为它实际上是装饰器设计模式的特殊版本:
function Foo () {
this.bar = function () {}
}
var f = new Foo();
f.bar();