簡體   English   中英

設置使用Object.create()創建的JavaScript對象的屬性

[英]Setting properties of JavaScript objects created with Object.create()

假設有一個使用以下JavaScript創建的簡單對象

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

我一直在閱讀Douglas Crockford的一些作品,他說創建以下對象是“更好”的選擇:

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

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

Object.create()的方式“更好”(我很想知道為什么會這樣),但是我看不到如何輕松地將參數傳遞給第二個版本的“ firstName” and 'lastName 我對C系列語法語言的了解要比對JavaScript更為熟悉,但是在我看來,對象創建的構造方法是“更好的”。 我為什么錯了? (對於企業級環境來說)

對於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方法一樣干凈/強大

Crockford的論點是OO與典型繼承並不能很好地融合在一起。 他覺得好像許多OO構造都已添加到該語言中,並且在這樣做之前應該經過更清晰的考慮。 在我自己的代碼中,我總是嘗試遵循他的聲音建議,因為他來自前線:)

您可以在Object.create()的第二個參數中傳遞firstNamelastName初始值:

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

它非常冗長,但是您可以創建自己的包裝器。

此處有更多詳細信息/示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM