【问题标题】:JavaScript: Creating objects based on a prototype without using new + ConstructorJavaScript:基于原型创建对象而不使用 new + Constructor
【发布时间】:2010-02-10 01:35:53
【问题描述】:

这可能吗?

我的想法:原型本质上是构造函数的属性(无论是原生构造函数,如函数、字符串或对象,还是您自己的自定义构造函数),只有“新”关键字才能利用构造函数及其对象原型创作

我错过了什么吗?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    你是对的,但是现在在 ECMAScript 第 5 版中,Object.create 方法能够使用另一个对象作为原型来创建对象实例:

    var proto = {foo: 1};
    var obj = Object.create(proto);
    

    在上面的例子中,obj 将被创建,它会在[[Prototype]] 内部属性中包含对proto 的引用,并且:

    obj.foo; // 1
    obj.hasOwnProperty('foo'); // false
    

    此方法来自 2009 年 12 月批准的新规范,据我所知,现在可用于 Mozilla JavaScript 1.9.3 实现。

    现在您可以通过 Douglas Crockford 的建议来模仿该方法的行为:

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

    【讨论】:

    • Cornford 曾经提出了一个稍微高效的“beget”版本(顺便说一句,最初由 Lasse Nielsen 提到,而不是 Crockford),其中“虚拟”函数(在您的示例中为 F)存储在关闭,然后被重用。这使得实现更高效的内存(和运行时)。另请注意,Crockford 的 Object.create 仿真几乎不符合 ES5(不支持第二个参数,如果第一个参数不是对象则不进行类型检查以抛出 TypeError 等)。谨慎使用;)
    • 你是救生员。我整天都在网上搜索这个想法。
    猜你喜欢
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多