0

Why is it useful to have these two functions, create and construct

if (!Object.create) {
  Object.create = function(base) {
    function F() {};
    F.prototype = base;
    return new F();
  }
}

if (!Object.construct) {
  Object.construct = function(base) {
    var instance = Object.create(base);
    if (instance.initialize)
      instance.initialize.apply(instance, [].slice.call(arguments, 1));
    return instance;
  }
}
4

2 回答 2

1

Object.create仅在 JavaScript 1.8.5 中引入,它允许创建具有指定原型和一组属性的新对象。您可能想要发布代码的原因是在不支持的旧浏览器中填充该功能Object.create。但是,要小心,因为 polyfill 实现只支持第一个参数。

以下是您可以使用它的方法:

var parentObject = { name: 'test' },
    childObject = Object.create(parentObject);

console.log(childObject.name); // -> test

至于,我在规范中没有找到对这个函数Object.construct的任何引用,但是据我所知,Object.create它和将向它传递您可能在参数之后传递的附加参数。initializebasebase

例如:

var parentObject = {
    initialize: function (name) {
        this.name = name;
    }
};

var childObject = Object.construct(parentObject, 'test');

console.log(childObject.name); // -> test
于 2013-03-30T13:23:58.823 回答
0

“我们”没有。 Object.create是一种在现代浏览器(按照规范运行 ES5 的这一部分)中创建对对象具有非常低级访问权限的对象的方法。

var bob = Object.create(Person.prototype, { name : {
                                                writeable : false,
                                                configurable : false,
                                                value : "Bob"          }});

bob继承自Person

bob.name现在等于“鲍勃”。
bob.name不能改写。
bob.name不能更改为不同的数据类型(数字/布尔值/NaN/null/等)。
bob.name不能被删除,除了,也许,完全摆脱bob, 。

这仅适用于现代浏览器。

polyfillObject.create只做继承部分,因为旧版本的 JavaScript 不允许访问对象的枚举,或者它们是可写的还是特定类型的等等。
因此,它们不能被填充。

没有人需要 Object.create。没有人不做系统架构(无论是 AJAX 库还是新的基于 NodeJS 的银行系统或云操作系统或其他),就是这样。即使这样,它也只有在您可以保证浏览器使用的是现代版本的 JS 时才有用。

于 2013-03-30T13:41:12.277 回答