Javascript对象创建的最佳实践

时间:2011-05-17 12:15:21

标签: javascript object closures creation

我有以下javascript:

            var MyObject = (function() {

                function Setup(args) {
                    this.prop1 = args.x;
                    this.prop2 = args.y
                    this.prop3 = this.prop1 + this.prop2;

                    this.Create = function() {
                        return 'a' + helperFunc();
                    }

                    function helperFunc() {
                        return this.prop3;
                    }
                }

                return {
                    init : function(args) {
                        var setup = new Setup(args);

                        setup.Create();
                    }
                }

            })();


            $(function() {

                MyObject.init(someArgs);

            });
  1. 我的对象构建方法是一种好习惯吗?

  2. 尝试访问undefined时,我在helperFunc中收到this.prop3

  3. 我还尝试将this.prop1 + this.prop2分配给局部变量并使用函数返回此值,如下所示:

            function Setup(args) {
                    var total;
    
                    this.prop1 = args.x;
                    this.prop2 = args.y
    
                    total = this.prop1 + this.prop2;
                    this.getTotal = function() {
                            return total;
                    };
    
                    this.prop3 = this.prop1 + this.prop2;
                    ...
    
  4. ...当在helperFunc中调用它时,如下所示:

                           return this.getTotal();
    

    ..我得this.getTotal不是函数

    我一直在阅读对象创建和使用闭包来模仿私人成员等等,因为没有一种方法来定义对象,我感到困惑。

    TBH - 我真的不明白这个结构:

                           var myObject = (function() { ... } ();
    

    我已经看到它在jQuery插件中使用了很多但是第一个parenth在结尾处跟着空的parenth是什么意思呢?

    非常感谢所传授的任何知识。

    另外,我已经订购了关于javascript的Douglas Crockford书籍,直到它到来我需要尝试解决这个问题

4 个答案:

答案 0 :(得分:4)

引用他提到的Xhalent's wonderful article(做得非常好,显然已经很好):

  

那是因为“this”的值是   不同于“这个”时的价值   对象已创建。

所以在你的情况下:

...
  var _this = this.prop3;
  function helperFunc() {
    return _this;
  }
...

可能会实现所需。

答案 1 :(得分:1)

我已经完成了一系列基本的javascript基础知识 - 这里介绍了对象和原型:

Javascript Object Instantation and Prototypes

我在这里深入研究闭包:Javascript Closures

希望他们有所帮助。欢呼声。

答案 2 :(得分:1)

如果您的函数使用this,则必须确保调用上下文正确。即使用this.helperFunc(),而不只是helperFunc()(但您还需要进行设置,以便定义this.helperFunc)。您示例中的helperFunc内的this指示对象与Create()中的指示对象不同。

您可以将其视为函数不是定义作为对象的成员,而称为作为对象的成员。

this可能会解决三件事情,具体取决于具体情况。

  1. 新创建的对象,如果函数调用前面有new关键字。
  2. 调用函数时点左侧的对象。
  3. 全局对象(window),如果上述两者均未提供。
  4. 如果在没有对象的情况下调用函数,就像在helperFunc中调用this.Create一样,this将绑定到全局对象(window ,在浏览器中使用时)

    考虑到这样的事情:

    var o = {someVal:"hello"};
    o.doSomething = function (){alert(this.someVal)};
    

    调用o.doSomething()显然会提醒“你好”。

    鉴于:

    var o2  = {someVal:"world"};
    o2.someFunc = o.doSomething;
    

    调用o2.someFunc()会提醒“世界”,而不是“你好”,如果它是指向doSomething o成员的指针,就会发出警告。

    并给出:

    var someFunc = o.doSomething
    someVal = "sailor"
    

    致电someFunc()会提醒“水手”。

    另一个混淆点是this直接使用Setup()。当您使用new调用函数时,this未绑定到全局对象,而是绑定到Setup对象的新实例。

    对于上面的示例,这意味着调用new o.doSomething()将警告“未定义”,因为为调用创建的新对象没有“someVal”成员。

答案 3 :(得分:0)

Mike Koss在this page的JS上有一个关于OOP的好教程。

  

我已经看到它在jQuery中使用了很多   插件,但第一个是什么   在父母后面是空父母   结束意味着什么?

第二组parenth立即调用你在第一组parenth中声明的函数。

你可以声明它并分别执行它(允许执行多次):

var myFunction = function() { alert("boo"); }; // Declare & instanciate
myFunction(); // Invoke
myFunction(); // Invoke again

或者在一行中做两件事:

(function() { alert("boo"); })(); // Can only invoke now, the function is anonymous and not stored anywhere.