当前位置: 首页 > 面试题库 >

使用“ Object.create”而不是“ new”

厍兴腾
2023-03-14
问题内容

Javascript 1.9.3 / ECMAScript5引入了Object.createDouglasCrockford等人提倡很长时间的技术。如何new在下面的代码中替换为Object.create

var UserA = function(nameParam) {
    this.id = MY_GLOBAL.nextId();
    this.name = nameParam;
}
UserA.prototype.sayHello = function() {
    console.log('Hello '+ this.name);
}
var bob = new UserA('bob');
bob.sayHello();

(假设MY_GLOBAL.nextId存在)。

我能想到的最好的是:

var userB = {
    init: function(nameParam) {
        this.id = MY_GLOBAL.nextId();
        this.name = nameParam;
    },
    sayHello: function() {
        console.log('Hello '+ this.name);
    }
};
var bob = Object.create(userB);
bob.init('Bob');
bob.sayHello();

似乎没有任何优势,所以我想我没有。我可能太新古典了。我应该如何使用Object.create来创建用户“ bob”?


问题答案:

仅具有一个继承级别,您的示例可能无法让您看到的真正好处Object.create

通过此方法,您可以轻松实现 差异继承 ,其中对象可以直接从其他对象继承。

在您的userB示例中,我认为您的init方法不应该是公共的,甚至不存在,如果您在现有对象实例上再次调用此方法,则idandname属性将发生变化。

Object.create 使您可以使用第二个参数来初始化对象属性,例如:

var userB = {
  sayHello: function() {
    console.log('Hello '+ this.name);
  }
};

var bob = Object.create(userB, {
  'id' : {
    value: MY_GLOBAL.nextId(),
    enumerable:true // writable:false, configurable(deletable):false by default
  },
  'name': {
    value: 'Bob',
    enumerable: true
  }
});

如您所见,可以Object.create使用与Object.definePropertiesObject.defineProperty方法相似的语法,使用对象常量在属性的第二个参数上初始化属性。

它可以让你设置属性的属性(enumerablewritable,或configurable),它可以是非常有用的。



 类似资料:
  • 问题内容: 每当我读到关于使用Scala的作者通常提的是演员,而应使用(此举例)。虽然我大致了解了Actor的工作原理,但我真的很想看到一个Actor的示例,该示例被用来在一段代码中替换Java的方法修饰符(这意味着它的Scala等效项- 块)。例如,修改数据结构的内部将很高兴。 这是对Actor的很好利用,还是我被误导了? 问题答案: Actor保证一次只处理一条消息,这样就不会有两个线程访问任

  • 我是说替换 只要 在班上名列前茅。对我有用。 请给出你的建议。 使用SpringJunit4ClassRunner.class而不是MockitoJunitRunner.class

  • 问题内容: 到目前为止,我一直在使用: 谢谢 编辑:我为可能遇到此页面的任何人提供了一种解决方案,以演示如何使用POST而不是GET。如果您不熟悉AJAX,建议您首先使用GET方法向本教程http://www.w3schools.com/PHP/php_ajax_php.asp推荐。 解- javascript: 的PHP: 由于有关使用POST和GET的原因-请参见注释。 问题答案: 您显示的查

  • 问题内容: 我有看起来像这样的XML: 我想使用JAXB进行阅读。 我知道我能做 如果XML看起来像 ,但是我对上面的XML布局怎么办? 问题答案: 注意: 我是EclipseLink JAXB(MOXy)的负责人,并且是JAXB 2.X(JSR-222)专家组的成员。 您可以在此用例中使用MOXy的扩展名:

  • 我试图导入的应用程序中的gradle版本与JDK11不兼容,而JDK11正是android studio用作其嵌入式JDK的。我的机器上有JDK8。我已经尝试进入项目结构来更改JDK8位置的路径,但是如果我尝试更改它,就会出现错误。它说我必须选择一个有效的JDK11目录。如何让android studio使用JDK 8?错误截图

  • 问题内容: 我不确定这是否可能。但是我想知道是否有人知道如何使超链接传递一些变量并使用POST(如表单)而不是GET。 问题答案: 您使用隐藏的输入创建表单,这些输入包含要发布的值,将表单的 操作 设置为目标url,并将表单方法设置为 post 。然后,当您单击链接时,触发提交表单的JS函数。 有关示例,请参见此处。本示例使用纯JavaScript,没有jQuery-如果您不想安装比现有更多的东西