有人可以解释这个OOP javascript结构

时间:2009-02-13 17:27:28

标签: javascript oop

有人可以解释这个OOP javascript结构吗?

我意识到你是如何在javascript中创建'对象'的,只需要对符号及其含义进行一些解释:

 var vote = function(){
     return {
            P1: function() {
                alert('P1');
            },

            P2: function() {
                alert('P2');
            }          

        };

    }();

    vote.P1();
    vote.P2();
  1. 为什么返回呼叫中的公共方法?这怎么可能?用逗号分隔?

  2. 为什么'对象'的结尾必须是();

  3. 内部方法和公共方法的命名约定?

  4. 公共属性和方法是否相同?有什么区别?

4 个答案:

答案 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)

  1. 它正在返回对象/哈希。请注意,在返回之后是{这是对象/哈希的开头。

  2. 运行返回对象的匿名函数。

  3. 我不知道你的意思。

  4. 是的,他们是一样的。属性可以是函数,因为javascript具有一等函数。

  5. 这段代码是设计的,所以很难说它有用。我不确定作者的意图是什么。看起来他可能一直致力于创建一个类似于类的东西,而不是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(){...} ();

据我所知,没有公共或私有,它都是公开的,函数与变量没有区别,只是它们的类型是函数。