设置 使用 Object.create() 创建的 JavaScript 对象的属性

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

本文关键字:JavaScript 对象 属性 创建 使用 Object create 设置      更新时间:2023-09-26

假设有一个简单的对象是用下面的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 的值。 我比 JavaScript 更熟悉 C 系列语法语言,但在我看来,对象创建的构造函数方法"更好"。 为什么我错了?(假设对于企业级环境(

对于克罗克福德的方式,您将执行以下操作:

  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结构被添加到语言中,在这样做之前应该更清楚地考虑。 在我自己的代码中,我总是试图遵循他的合理建议,因为他来自前线:)

您可以将第二个参数中的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

它非常冗长,但您可以创建自己的包装器。

更多细节/示例在这里。