javascript - 使用 "Object.create"而不是 "new"

标签 javascript constructor new-operator object-create

Javascript 1.9.3/ECMAScript 5 引入了 Object.create,其中 Douglas Crockford 一直是 advocating需很长时间。如何将下面代码中的 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 方法不应该是公共(public)的甚至不存在, idname 属性将会改变。

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 方法。

它可以让您设置属性属性(enumerablewritableconfigurable),非常有用。

关于javascript - 使用 "Object.create"而不是 "new",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2709612/

相关文章:

c++ - 哪一种是在 C++ 中分配未初始化内存的最惯用的方法

javascript - 在选择器中的 JQuery 中返回 true 或 false?

c++ - 自定义内存分配器 : T* pointer, operator new 与 void pointer cast

javascript - flask "Pick-List"小部件

c++ - 在函数调用中更新静态成员会导致崩溃

Javascript继承,成员未定义

java - 为子类传递构造函数参数时出现"Could not resolve matching constructor"错误

c++ - CUDA C编译错误: new operator is not allowed in global function

php - 为什么这个 php 不能与谷歌地图一起使用?

javascript - 将嵌套的 knockout View 模型传递给 Controller