2012-03-08 73 views
1

我一直在使用下面,我見過其他代碼使用函數(){},然後使用這個關鍵字,這裏有什麼區別,我真的實例化一個對象下面?JavaScript中的兩個OO方法有什麼區別?

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

我必須在一個關子,因爲我從來沒有見過一個對象的構造類似。 – 2012-03-08 02:00:36

+0

當然,你從函數返回一個對象。儘管如此,似乎有點奇怪。 – 2012-03-08 02:01:37

+0

@JeffreySweeney:它不只是你。這段代碼對我來說看起來很奇怪。我打賭它沒有做它應該做的事。 – cHao 2012-03-08 02:03:05

回答

2

我可以做這樣的事情想到的唯一理由是,如果你想有兩個功能之間進行共享,一些私有變量(改變它,使之合法的JavaScript後):

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() {}   
}; 
2

是的,你一個實例「單身」對象有兩種方法。

我相信外花括號是不必要的,你可以這樣寫:

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; 
    })(); 

(function() { /* code here */ })()包裝一下你的JS是預防好習慣變量泄漏到全球範圍內。在這種情況下,您正在使用它來組裝一個對象。

1

使用關鍵字this的函數可以使用對象字面值(這是以上匿名函數的返回值)執行一些比可能(或至少很容易)更多的操作。最常見的是創建「類型」。

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 

演示:http://jsfiddle.net/hEnJf/