为什么我们需要创建和构造函数

时间:2013-03-30 12:57:32

标签: javascript

为什么有这两个函数,创建和构造

是有用的
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;
  }
}

2 个答案:

答案 0 :(得分: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的作用相同,但另外,它会调用initialize对象在新创建的对象的上下文中的base函数,并将传递给您在base参数之后可能已经传递的附加参数。

例如:

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

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

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

答案 1 :(得分:0)

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

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

bob继承自Person

bob.name现在等于“Bob” bob.name无法重写 bob.name无法更改为其他数据类型(number / boolean / NaN / null / etc)。
bob.name无法删除,除非完全删除bob

这只适用于现代浏览器。

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

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