为了账号安全,请及时绑定邮箱和手机立即绑定

理解Object.create()和新SomeFunction()之间的区别

理解Object.create()和新SomeFunction()之间的区别

阿晨1998 2019-06-25 15:57:05
理解Object.create()和新SomeFunction()之间的区别我最近偶然发现Object.create()方法,并试图推断它与创建对象的新实例有何不同new SomeFunction()当你想用一个而不是另一个的时候。考虑以下示例:var test = {  val: 1,  func: function() {    return this.val;  }};var testA = Object.create(test);testA.val = 2;console.log(test.func()); // 1console.log(testA.func()); // 2console.log('other test');var otherTest = function() {  this.val = 1;  this.func = function() {    return this.val;  };};var otherTestA = new otherTest();var otherTestB = new otherTest();otherTestB.val = 2;console.log(otherTestA.val); // 1 console.log(otherTestB.val); // 2console.log(otherTestA.func()); // 1console.log(otherTestB.func()); // 2请注意,在这两种情况下都观察到了相同的行为。在我看来,这两种情况之间的主要区别是:中使用的对象。Object.create()实际上形成了新对象的原型,而在new Function()从声明的属性/函数中不形成原型。属性创建闭包。Object.create()语法与函数式语法一样。考虑到JavaScript的词法(VS块)类型范围,这是合乎逻辑的。以上说法正确吗?我是不是遗漏了什么?你什么时候会用一种而另一种呢?编辑:链接到上述代码示例的jsfiddle版本:http://jsfiddle.net/rZfYL/
查看完整描述

3 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

在Object.create中使用的对象实际上构成了新对象的原型,其中与新函数()形式一样,声明的属性/函数并不构成原型。

是,Object.create构建一个直接从作为其第一个参数传递的对象继承的对象。

通过构造函数,新创建的对象继承了构造函数的原型,例如:

var o = new SomeConstructor();

在上面的例子中,o直接继承SomeConstructor.prototype.

这里有一个不同的地方Object.create您可以创建一个不继承任何东西的对象,Object.create(null);,另一方面,如果你SomeConstructor.prototype = null;新创建的对象将从Object.prototype.

不能像使用函数语法那样使用Object.create语法创建闭包。考虑到JavaScript的词法(VS块)类型范围,这是合乎逻辑的。

您可以创建闭包,例如使用属性描述符参数:

var o = Object.create({inherited: 1}, {
  foo: {
    get: (function () { // a closure
      var closured = 'foo';
      return function () {
        return closured+'bar';
      };
    })()
  }});o.foo; // "foobar"

请注意,我说的是ECMAScript第5版Object.create方法,不是克罗克福德的垫子。

该方法已开始在最新的浏览器上进行本机实现,请检查兼容性表.


查看完整回答
反对 回复 2019-06-25
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

很简单的说,new XObject.create(X.prototype)通过额外运行constructor功能。(并给予constructor有机会return应该是表达式的结果的实际对象,而不是this.)

就这样。*)

其余的答案都是令人困惑的,因为显然没有其他人读到new也一样。;)


查看完整回答
反对 回复 2019-06-25
  • 3 回答
  • 0 关注
  • 488 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号