有人可以解释这个OOP javascript结构吗?
我意识到你是如何在javascript中创建'对象'的,只需要对符号及其含义进行一些解释:
var vote = function(){
return {
P1: function() {
alert('P1');
},
P2: function() {
alert('P2');
}
};
}();
vote.P1();
vote.P2();
为什么返回呼叫中的公共方法?这怎么可能?用逗号分隔?
为什么'对象'的结尾必须是();
内部方法和公共方法的命名约定?
公共属性和方法是否相同?有什么区别?
答案 0 :(得分:12)
var vote = function(){
var privateMember = 3; // lets define a private member, this will only be available inside the function scope, so we can't do "vote.privateMember" because we're not returning it below
// It's returning an object, {}
// these are considered public because they are returned by the function, making them available outside the function scope using the "dot" operator, "vote.P1()"
return {
// first value of the object is a function
// so we can call this like "vote.P1()"
// we're calling a privateMember in here
P1: function() {
alert('P1');
alert(privateMember);
},
// second value of the object is a function
// so we can call this like "vote.P2()"
P2: function() {
alert('P2');
}
};
}(); // () means it will execute the function, so "vote" will store the return value of this function, it's a shorthand for `var vote = function(){}; vote = vote();
私有方法的命名约定通常是在方法/属性名_privateMethod: function(){}
之前加下一个下划线。
答案 1 :(得分:2)
它正在返回对象/哈希。请注意,在返回之后是{这是对象/哈希的开头。
运行返回对象的匿名函数。
我不知道你的意思。
是的,他们是一样的。属性可以是函数,因为javascript具有一等函数。
这段代码是设计的,所以很难说它有用。我不确定作者的意图是什么。看起来他可能一直致力于创建一个类似于类的东西,而不是javascript基于原型OO的方式。这段代码可以很容易编写。
var vote = {
P1: function() {
alert('P1');
},
P2: function() {
alert('P2');
}
};
答案 2 :(得分:2)
三个重要概念:匿名函数,对象文字,闭包。
您可以声明并执行一个函数,而无需将其赋值给变量。在你的例子中,foo不是一个函数,它是调用的结果:
var item = function(){ /*function code here*/ }**()**;
< - 因为函数正在执行,item是函数返回的对象,而不是函数。
说你这样做了:var a = new Object(); a.foo = 'bar';
对象文字符号如下所示:var a = {foo: 'bar'};
在您的示例中,您的匿名函数返回一个具有两个函数P1和P2的新对象。它只是指定对象的另一种表示法。
当函数返回一个对象时,该对象保留对函数作用域的访问 - 这称为闭包。所以,如果你这样做:
var a = function(){
var _pvt = 'foo';
return {
aFunc: function(){alert(_pvt);}
};
}();
a.aFunc();
_pvt
的范围是匿名函数。此函数使用一个方法(aFunc
)返回一个新对象。匿名函数的作用域可通过闭包用于此对象,因此在调用a.aFunc()
时,_pvt
将可用。
关于这一点的最佳地点是YUI剧院的Douglas Crockford视频:http://video.yahoo.com/watch/111585/1027823
答案 3 :(得分:1)
这是JSON(javascript对象表示法)。它类似于python中的字典格式。
可以使用
内联定义数组[1,2,3,4,5]
和对象可以使用
内联定义{ field1: value1, field2: value2, field3: value3 }
也可以内联定义一个函数,
var a = function() { .... } //a is a function
函数之后的()用于在定义后立即调用函数!因为函数是内联定义的,所以就像说:
x = function() { ... }
y = x();
但缩写为:
y = function(){...} ();
据我所知,没有公共或私有,它都是公开的,函数与变量没有区别,只是它们的类型是函数。