我是Javascript的新手,我仍然围绕创建对象的各种方式,即构造函数+ new,prototypal,functional&部分。
我创建了我认为使用模块模式的对象工厂,并想知道调用内部方法的正确方法是什么。是通过 此 还是 功能名称 。
这是我的模块:
function chart() {
function my() {
// generate chart here, using `width` and `height`
}
my.sayHi = function(){
console.log('hi');
my.sayBye();
};
my.sayBye = function(){
console.log('Bye');
};
return my;
}
var test = chart();
test.sayHi();
您可以看到第一个函数使用 my.sayBye()调用第二个函数,或者使用 this.sayBye()更好。两者都产生相同的结果并且运行没有错误。
答案 0 :(得分:4)
模块模式允许您根据需要省略'this'变量。我可能会重写上面的代码看起来像这样,然后问题变得毫无意义。
function chart() {
var hiCount = 0;
function sayHi(){
console.log('hi');
hiCount++;
sayBye();
};
function sayBye(){
console.log('Bye');
};
return {
sayHi : sayHi,
sayBye: sayBye
};
}
var test = chart();
test.sayHi();
在上面的代码中,所有内容都在函数chart
中定义。由于每次调用chart
函数时,JavaScript的作用域都处于函数级别,因此将定义一组新函数。并且还可以定义一组新的变量,这些变量对于函数是私有的,因为它们在函数中定义并且不能从外部访问。我添加了hiCount
作为如何执行此操作的示例。 Module模式允许JavaScript中的隐私。它比原型模式占用更多内存,但每次声明一个函数时,它不会在同一个类的其他实例之间共享。这是您必须在Javascript中支付的价格才能拥有私有的类变量。我愿意付钱。从我的代码中删除“this”使得它更容易理解,并且我不太可能陷入错位的范围。
答案 1 :(得分:1)
使用"这个"是更好的方法,因为您可以将函数直接绑定到父函数对象。并且您不需要从函数返回任何内容。 在你的情况下,你明确地返回另一个函数 以下是使用"这个"方法
function chart() {
this.sayHi = function(){
console.log('hi');
}
}
var test = new chart();
test.sayHi();
使用这种方法,你可以在函数原型中调用任何东西" chart" 例如
chart.prototype.hello = function(){
console.log('hello')
}
所以你可以从同一个对象(测试)调用hello函数