两种JavaScript对象类型之间的差异

dzm*_*dzm 2 javascript prototype

我看到JavaScript中的对象最常用于以下两种方式.有人可以解释两者之间的区别和好处吗?是否存在一个更适合另一个的情况?

真的很感激任何澄清.非常感谢!

第一:

   var SomeObject;

    SomeObject = (function() {

     function SomeObject() {}

         SomeObject.prototype.doSomething: function() {

         },
         SomeObject.prototype.doSomethingElse: function() {

         }

    })();
Run Code Online (Sandbox Code Playgroud)

第二:

SomeObject = function() {

 SomeObject.prototype.doSomething: function() {

 },
 SomeObject.prototype.doSomethingElse: function() {

 }

}
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 5

这两个例子都不正确.我想你的意思是:

第一:

var SomeObject;
SomeObject = (function() {

    function SomeObject() {
    }

    SomeObject.prototype.doSomething = function() {
    };

    SomeObject.prototype.doSomethingElse = function() {
    };

    return SomeObject;

})();
Run Code Online (Sandbox Code Playgroud)

(注意匿名函数末尾的返回,使用=而不是:和分号来完成函数赋值.)

或者你的意思是:

function SomeObject() {
}

SomeObject.prototype.doSomething = function() {
};

SomeObject.prototype.doSomethingElse = function() {
};
Run Code Online (Sandbox Code Playgroud)

(没有匿名封闭功能.)

第二:

function SomeObject() {
}
SomeObject.prototype = {

    doSomething: function() {
    },
    doSomethingElse: function() {
    }
};
Run Code Online (Sandbox Code Playgroud)

(注意,对原型的赋值在函数之外SomeObject ;这里,我们使用:因为我们在一个对象初始化器中.并且我们;最后还有完成赋值语句.)

如果我是对的,那么它们之间几乎没有什么区别.它们都创建了一个SomeObject构造函数,并为其原型添加了匿名函数.第二个版本替换SomeObject构造函数的原型有一个完全新的对象(我不推荐),其中第一个只是增强了原型SomeObject构造函数已经有了.

一个更有用的形式是:

var SomeObject;
SomeObject = (function() {

    function SomeObject() {
    }

    SomeObject.prototype.doSomething = doSomething;
    function doSomething() {

    }

    SomeObject.prototype.doSomethingElse = doSomethingElse;
    function doSomethingElse()
    }

    return SomeObject;

})();
Run Code Online (Sandbox Code Playgroud)

在那里,我们分配的职能doSomething,并doSomethingElse名称(他们显示在调用栈,断点列表等),当你通过调试代码走这是有用的.包含所有内容的匿名函数是存在的,因此doSomethingdoSomethingElse名称不会污染封闭的名称空间.更多:Anonymousouses匿名

我们中的一些人更进一步:

var SomeObject;
SomeObject = (function() {
    var p = SomeObject.prototype;

    function SomeObject() {
    }

    p.doSomething = SomeObject$doSomething;
    function SomeObject$doSomething() {

    }

    p.doSomethingElse = SomeObject$doSomethingElse;
    function SomeObject$doSomethingElse()
    }

    return SomeObject;

})();
Run Code Online (Sandbox Code Playgroud)

......这样我们不仅可以看到doSomething,而且可以列SomeObject$doSomething在清单中.但有时可能会妨碍它,这是一种风格选择.(另请注意,我使用匿名函数来包含别名SomeObject.prototype,以减少输入.)