面向对象JavaScript帮助
我有以下代码:面向对象JavaScript帮助,javascript,singleton,oop,closures,Javascript,Singleton,Oop,Closures,我有以下代码: var HD = function() { }; HD.Car = (function() { var _date = "09/07/2010"; return { Make: undefined, Model: undefined, showMakeAndModel: function() { document.write(this.Make + " " +
var HD = function() { };
HD.Car = (function() {
var _date = "09/07/2010";
return {
Make: undefined,
Model: undefined,
showMakeAndModel: function() {
document.write(this.Make + " " +
this.Model +
" (data correct as of " + _date + ")");
}
};
})();
var bert = new HD.Car();
bert.Make = "Ford";
bert.Model = "Capri";
window.onload = bert.showMakeAndModel();
并获取以下错误:
汽车不是建造师
我所要做的只是测试(学习)带有闭包的“单例模式”(针对私人成员),因此不是一个“真实”的例子,但我正在读的书建议这是一种方法
所以有点困惑-任何帮助都将不胜感激。。
Rob删除
新建
,因为它仅用于构造函数。现在HD.Car将是匿名和自动执行的函数返回的对象。然后在HD.Car之后移除parens。所以它应该看起来像:
var bert = HD.Car;
现在HD.Car是一个单体
如果您希望它更像一个工厂
,您应该:
HD.Car = function() {
var _date = "09/07/2010";
return {
Make: undefined,
Model: undefined,
showMakeAndModel: function() {
document.write(this.Make + " " +
this.Model +
" (data correct as of " + _date + ")");
}
};
};
var bert = new HD.Car();
在JavaScript中,只能将new关键字与函数一起使用
HD.Car
不是一个函数,而是一个对象
只是不要在示例中使用new
。HD.Car类定义中有一些不正确的()()。此固定示例适用于:
var HD = function() { };
HD.Car = function() {
var _date = "09/07/2010";
return {
Make: undefined,
Model: undefined,
showMakeAndModel: function() {
document.write(this.Make + " " +
this.Model +
" (data correct as of " + _date + ")");
}
};
};
var bert = new HD.Car();
bert.Make = "Ford";
bert.Model = "Capri";
window.onload = bert.showMakeAndModel();
您的错误来自于您正在执行构造函数的事实,正如HD.Car声明后的左括号和右括号所示(就在var bert之前)。因此,函数正在执行并返回一个对象,然后您将尝试使用“new”操作符
如果删除这些括号,我相信您将获得所需的功能。更多信息:
希望这会给你带来更多的光明 车不是一个常规功能。。。它是一个对象,每个函数都是一个对象。正则函数意味着它不是构造函数。先读后评论。不,函数不是对象。如果你指的是做HD.something
的能力,这是可能的,因为HD
只是一个名称空间,而不是因为它是一个函数。事实上,var HD=3;HD.something=4
也可以工作,因为JavaScript提供了向名称空间添加属性的功能,即使它们不是对象。:)这里有两件事。我误读了上面的代码,我应该改正。但你最后的陈述仍然是错误的。函数是js中的对象…@galambalazs,同样不,请看一下typeof
操作符。构造函数不应该返回任何东西。我同意,但是,我相信他使用的模式是使用return,以确保如果它作为函数意外调用,它会有相同的结果。是的,但是,您分配的属性Make
和Model
不会引用HD.Car
实例的属性,它们只是bert
名称空间的属性。Luca我想您可能在这里了解了一些东西,因为intellisense(VS)没有选择“bert.showMakeAndModel()”—但是,首先,这是可行的,其次,“_date”是一个私人成员。我确实需要一个解决方案,其中“bert.showMakeAndModel()”以智能感知方式出现…@LiverpoolsNumber9,我不想再帮你了,请阅读一本书。如果没有“new”关键字,我如何实例化一个新的HD.Car对象?@LiverpoolsNumber9你可以使用new,然后实例化看看我的答案。向阅读本页的任何人道歉。我不能删除它,虽然我现在想删除!不幸的是,一些投稿人使这篇文章无法使用。如果还有人想帮忙的话,我会很快再发同样的问题。一旦答案存在,我会在这里添加链接。版主-请随意删除这篇文章。我们已经解决了您的问题,您说“投稿人使这篇文章无法使用”?galambalazs-是的,您都为回答这个问题做出了贡献,尽管还没有完全回答。你和大卫的答案都很贴切。然而,这里的问题是,这已经变成了一个讨论-堆栈不是一个讨论论坛的确切原因是,人们来到页面后不应该费力地通过讨论(或在这种情况下的争论)来找到答案。这就是为什么,在我看来,这篇文章几乎毫无用处。不是你的错,伙计,我真的很感激你的贡献。