javascript中两种OO方法的区别是什么?

javascript中两种OO方法的区别是什么?,javascript,Javascript,我一直在使用下面的代码,我看到其他代码使用函数{},然后使用this关键字,这里的区别是什么,我是否实际实例化了下面的对象 var MyObj = { propertyOne: 'a', Method: (function() { function MyFuncOne() {} function MyFuncTwo() {} return {

我一直在使用下面的代码,我看到其他代码使用函数{},然后使用this关键字,这里的区别是什么,我是否实际实例化了下面的对象

    var MyObj = {
 propertyOne: 'a',
            Method: (function() {
                function MyFuncOne() {}
                function MyFuncTwo() {}
                return {
                    MyFuncOne: MyFuncOne,
                    MyFuncTwo: MyFuncTwo
                }
            })()
        }

我能想到这样做的唯一原因是,如果您希望在更改私有变量以使其合法化后,在两个函数之间共享一些私有变量:

var MyObj = (function() {
        var x,y,z;    // these will be accessible only to 
                      // the MyFuncOne and MyFuncTwo functions
        function MyFuncOneA() {}
        function MyFuncTwoA() {}
        return {
            MyFuncOne: MyFuncOneA,
            MyFuncTwo: MyFuncTwoA
        }
    })();
我不得不改变你的语法,甚至使它工作,因为你有它myObj={{…},这是不是很有用,甚至可能是无效的

除了这个私有但共享变量的概念之外,它只是在一个对象上声明两个方法的额外的、混乱的语法,有更清晰的方法可以做到这一点

如果您没有使用私有变量,那么上面的示例在功能上与这个简单得多的语法相同,这对我来说更有意义:

var MyObj = {
    MyFuncOne: function() {},
    MyFuncTwo: function() {}        
};

我能想到这样做的唯一原因是,如果您希望在更改私有变量以使其合法化后,在两个函数之间共享一些私有变量:

var MyObj = (function() {
        var x,y,z;    // these will be accessible only to 
                      // the MyFuncOne and MyFuncTwo functions
        function MyFuncOneA() {}
        function MyFuncTwoA() {}
        return {
            MyFuncOne: MyFuncOneA,
            MyFuncTwo: MyFuncTwoA
        }
    })();
我不得不改变你的语法,甚至使它工作,因为你有它myObj={{…},这是不是很有用,甚至可能是无效的

除了这个私有但共享变量的概念之外,它只是在一个对象上声明两个方法的额外的、混乱的语法,有更清晰的方法可以做到这一点

如果您没有使用私有变量,那么上面的示例在功能上与这个简单得多的语法相同,这对我来说更有意义:

var MyObj = {
    MyFuncOne: function() {},
    MyFuncTwo: function() {}        
};

是的,您已经用两个方法实例化了一个单例对象

我认为外部的花括号是不必要的,你可以这样写:

var MyObj = 
    (function() {
        function MyFuncOne() {}
        function MyFuncTwo() {}
        return {
            MyFuncOne: MyFuncOne,
            MyFuncTwo: MyFuncTwo
        };
    })();
另一种方法是:

var MyObj = 
    (function() {
        var obj = {};
        obj.MyFuncOne = function() {};
        obj.MyFuncTwo = function() {};
        return obj;
    })();

在函数{/*code here*/}中包装JS是防止变量泄漏到全局范围的良好实践。在本例中,您使用它来组装一个对象。

是的,您已经用两个方法实例化了一个单例对象

我认为外部的花括号是不必要的,你可以这样写:

var MyObj = 
    (function() {
        function MyFuncOne() {}
        function MyFuncTwo() {}
        return {
            MyFuncOne: MyFuncOne,
            MyFuncTwo: MyFuncTwo
        };
    })();
另一种方法是:

var MyObj = 
    (function() {
        var obj = {};
        obj.MyFuncOne = function() {};
        obj.MyFuncTwo = function() {};
        return obj;
    })();
在函数{/*code here*/}中包装JS是防止变量泄漏到全局范围的良好实践。在本例中,您正在使用它来组装一个对象。

使用带有此关键字的函数,您可以完成比可能更多的事情,或者至少可以轻松地使用上面的匿名函数返回的对象文本。最常见的是创建类型

function Animal () { }
Animal.prototype.speak = function () {
    return "";
};
var dog = new Animal();
dog instanceof Animal;    // returns true 
这也使继承更容易:

function Feline () { }
Feline.prototype = new Animal;
Feline.prototype.speak = function () {
    return "meow";
};
function Lion () { }
Lion.prototype = new Feline;
Lion.prototype.speak = function () {
    return "roar";
};
function Cat () { }
Cat.prototype = new Feline;
var leo = new Lion();
var baxter = new Cat();
leo.speak();       // returns "roar"
baxter.speak();    // returns "meow" - from prototype chain
leo instanceof Feline;   // returns true 
leo instanceof Animal;   // returns true
leo instanceof Cat;      // returns false
演示:

使用带有此关键字的函数,您可以完成比可能更多的事情,或者至少可以轻松地使用上面的匿名函数返回的对象文本。最常见的是创建类型

function Animal () { }
Animal.prototype.speak = function () {
    return "";
};
var dog = new Animal();
dog instanceof Animal;    // returns true 
这也使继承更容易:

function Feline () { }
Feline.prototype = new Animal;
Feline.prototype.speak = function () {
    return "meow";
};
function Lion () { }
Lion.prototype = new Feline;
Lion.prototype.speak = function () {
    return "roar";
};
function Cat () { }
Cat.prototype = new Feline;
var leo = new Lion();
var baxter = new Cat();
leo.speak();       // returns "roar"
baxter.speak();    // returns "meow" - from prototype chain
leo instanceof Feline;   // returns true 
leo instanceof Animal;   // returns true
leo instanceof Cat;      // returns false

演示:

我一定是个闭门造车的人,因为我从来没有见过这样的对象构造。当然,您是从函数返回对象的。看起来有点奇怪。@JeffreySweeney:不仅仅是你。在我看来,那个代码完全是奇怪的。我敢打赌它做不到它应该做的。这个片段在语法上是不正确的。大括号是用来代替分号的。它在IE9和Chrome中运行良好,但你是对的,它不是有效的ECMAScript。我必须是一个闭门造车的人,因为我从未见过这样的对象构造。当然,你是从函数返回一个对象。看起来有点奇怪。@JeffreySweeney:不仅仅是你。在我看来,那个代码完全是奇怪的。我敢打赌它做不到它应该做的。这个片段在语法上是不正确的。大括号是用来代替分号的。它在IE9和Chrome中运行良好,但您是对的,它不是有效的ECMAScript。