newJavaScript中的关键字在第一次遇到时会非常混乱,因为人们倾向于认为JavaScript不是面向对象的编程语言.
在UPDATE 2/ANSWER中回答下面的内容
感谢Joseph帮助我找到答案(即使我不喜欢它=).
原始问题
虽然在JavaScript中使用Namepsaces时做的最佳做法的一些研究,我碰到这个定义中的"模型模式"的:http://yuiblog.com/blog/2007/06/12/module-pattern/.
自从我在YUI2年前看到它以来,我一直在使用这种模式,本文给出了概念的一个很好的概述.但它没有触及的是为什么"自我执行匿名函数"被用来代替"新函数".这在评论中被提出,但作者没有很好地描述.由于这篇文章已有4年多了(我在网上其他地方找不到答案),我想我会把它带到这里.
它已经关闭了,所以呢?(请参阅:为什么这个函数包含在括号中,后跟括号?它也没有回答我的问题=).
假设以下设置代码..
var MyNamespace = window.MyNamespace || {};
Run Code Online (Sandbox Code Playgroud)
哪个是首选,为什么?
MyNamespace.UsingNew = new function() {
var fnPrivate = function() {
return "secrets1";
};
this.property = "value1";
this.method = function() {
return "property = " + this.property + ' ' + fnPrivate();
}
};
MyNamespace.UsingSelfEx = (function() { //# <- Added "pre-parens" suggested by chuckj
var fnPrivate = function() {
return "secrets2";
};
var fnReturn = {};
fnReturn.property = "value2";
fnReturn.method = …Run Code Online (Sandbox Code Playgroud) 我得到了模块模式的基础知识,并使用了一个闭包来允许私有成员,但是我不能完全接受为什么下面的代码会做它的作用:
var Calculator = function() {
var priv = 0;
return {
changePriv: function() { priv++;},
printPriv: function() { console.log(priv);}
}
}
var myCalc = Calculator();
myCalc.printPriv();
myCalc.changePriv();
myCalc.printPriv();
var myOtherCalc = Calculator();
myCalc.printPriv();
Run Code Online (Sandbox Code Playgroud)
控制台输出是
0
1
1
Run Code Online (Sandbox Code Playgroud)
因此,故意在new此处省略关键字,第一个调用设置myCalc为Calculator对象.它以priv值0开始,递增,然后打印出新priv值1.
但是a)为什么下一次调用Calculator()最终会返回对SAME对象的引用(由第二个'1'证明)?我知道我可以new在这里使用并避免这种情况,但不知道为什么我必须这样做.是不是这个函数使用对象文字语法来实质上创建一个新对象然后返回它?b)因为它似乎确实使用了相同的函数堆栈空间(即使是在JS中考虑它的正确方法?),为什么priv在将引用返回到同一对象之前它不会将过程中的变量清零?
编辑:修正了草率/愚蠢的错误(谢谢scessor),即使不使用new关键字,它现在也会输出一个新的/不同的计算器对象.这样就可以清除a)和b).我得到的问题是" new在模块模式构造函数的调用中是否使用是否重要.答案是,我认为无关紧要(?).(约瑟夫:见http:// jsfiddle. net/MvMvy/5 / ... instanceof运算符无论如何都无法使用模块模式.)
看到这段代码:
function friend(name) {
return { name: name };
}
var f1 = friend('aa');
var f2 = new friend('aa');
alert(f1.name); // -> 'aa'
alert(f2.name); // -> 'aa'
Run Code Online (Sandbox Code Playgroud)
f1和之间有什么区别f2?
我是新手,正在使用 javascript 方式。在关闭点。我可以使用new关键字和不使用关键字创建对象new,这让我很奇怪。
这里的代码:-
function RankingManage(rank) {
var rank = rank;
function rankInc() {
rank++;
}
function rankDec() {
rank--;
}
return {
makeInc: function () {
rankInc();
},
makeDec: function () {
rankDec();
},
showRank: function () {
return rank;
}
}
}
var Rank = new RankingManage(80);
var Rank2 = RankingManage(80);
Rank.makeInc();
Rank2.makeInc();
console.log(Rank.showRank());//Output:- 81
console.log(Rank2.showRank());//Output:- 81
Run Code Online (Sandbox Code Playgroud)