2013-10-09 77 views
0

比方說,有一個與下面的JavaScript設置屬性的對象用的Object.create()創建

Builder = function (firstName, lastName) { 
       this.firstName = firstName; 
       this.lastName = lastName; 
      } 
      Builder.prototype.build = function() { 
       return 'building....'; 
      }; 
      var b2 = new Builder('firstName', 'lastName'); 

我已經在一些道格拉斯Crockford的工作,閱讀起來,他說,這是創建了一個簡單的對象「好」 創建類似對象以下內容:

var builder = { 
       build: function() { 
        return 'building...'; 

       }, firstName: 'firstName' 
       , lastName: 'lastName' 
      }; 
      var b1 = Object.create(builder); 

的的Object.create()方法是「好」(我會好奇,從專家,爲什麼聽到的),但我不看看我們如何輕鬆地將參數傳遞給第二個版本的值'姓'and 'lastName。我對C語言的語法語言比JavaScript更熟悉,但在我看來,對象創建的構造方法是「更好的」。爲什麼我錯了? (比方說,對於企業級環境)

回答

2

對於Crockford的方式,你會做以下幾點:

 
    var build = function(firstName, lastName) { 
    // do private stuff here.. but this closure will still be accessible to the returned object 
    return { 
     firstName:firstName, 
     lastName:lastName 
    } 
    }

var b = build('john', 'smith')

它只是作爲清潔/強大的面向對象的方式

克羅克福德的理由是: OO不能與典型的遺傳混合。他覺得很多面向對象的構造都被添加到了語言中,並且在這樣做之前應該更清楚地思考。在我自己的代碼,我總是試圖跟隨他的中肯的意見,因爲他來自前線:)

+0

最好的方法是通過站在巨人的肩膀:) – wootscootinboogie

+0

在我的迭代構建器是一個對象文字。在你的版本中它是一個功能。這有什麼影響? – wootscootinboogie

+0

@wootscootboogie,很好的一個,它可以利用與咖喱,部分應用等。其次,我發現你可以用較少的鍋爐板與後一種技術 –

1

您可以firstNamelastName在第二個參數Object.create()通過初始值:

var builder = { 
    getFullName : function() { 
     return this.firstName + " " + this.lastName; 
    } 
}; 

var b1 = Object.create(builder, { 
    firstName : { writable:true, configurable:true, value: "Joe" }, 
    lastName : { writable:true, configurable:true, value: "Shmoe" } 
    } 
); 

b1.getFullName() //prints out: Joe Shmoe 

其非常詳細,但你可以創建自己的包裝。

更多資料/示例here