假设有一个使用以下JavaScript创建的简单对象
Builder = function (firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
Builder.prototype.build = function () {
return 'building....';
};
var b2 = new Builder('firstName', 'lastName');
我一直在读道格拉斯·克罗克福德的一些作品,他说它“更好” 创建如下对象:
var builder = {
build: function () {
return 'building...';
}, firstName: 'firstName'
, lastName: 'lastName'
};
var b1 = Object.create(builder);
Object.create()方式是“更好”(我很想听听专家说明为什么),但我不知道如何轻松地将参数传递给第二个版本的值“的firstName and 'lastName
。我比C系列语法语言更熟悉JavaScript,但在我看来,对象创建的构造方法是“更好”。为什么我错了? (假设是企业级环境)
答案 0 :(得分: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方式一样干净/强大
Crockford的论点是,OO与典型的继承并不完美。他觉得好像很多OO结构被添加到语言中,并且在这样做之前应该更清楚地考虑出来。在我自己的代码中,我总是试图遵循他的声音建议,因为他来自前线:)
答案 1 :(得分:1)
您可以将第二个参数中firstName
和lastName
的初始值传递给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。