![](/img/trans.png)
[英]javascript Object.create: setting properties "directly" vs setting properties declared in propertiesObject
[英]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()
的第二個參數中傳遞firstName
和lastName
初始值:
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.