面向对象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-是的,您都为回答这个问题做出了贡献,尽管还没有完全回答。你和大卫的答案都很贴切。然而,这里的问题是,这已经变成了一个讨论-堆栈不是一个讨论论坛的确切原因是,人们来到页面后不应该费力地通过讨论(或在这种情况下的争论)来找到答案。这就是为什么,在我看来,这篇文章几乎毫无用处。不是你的错,伙计,我真的很感激你的贡献。