【问题标题】:How to clone a prototype with property methods?如何使用属性方法克隆原型?
【发布时间】:2015-03-27 10:40:27
【问题描述】:

我正在使用 Typed.React 库,其中包含一种方法,可以用另一个原型定义扩展一个原型定义:

function extractPrototype(clazz) {
    var proto = {};
    for (var key in clazz.prototype) {
        proto[key] = clazz.prototype[key];
    }
    return proto;
}

如果提供的类定义了属性方法,则此函数具有执行 get 方法的副作用,例如

var TestObject = (function () {
    function TestObject() {
        this.str = "test string";
    }
    Object.defineProperty(TestObject.prototype, "TestProperty", {
        get: function () {
            console.log("exec get");
            return this.str;
        },
        set: function (value) {
            console.log("exec set");
            this.str = value;
        },
        enumerable: true,
        configurable: true
    });
    return TestObject;
})();

var extracted = extractPrototype(TestObject);

当extactPrototype访问TestObject.prototype["TestProperty"]时,会执行属性get方法并打印:

exec get

如何在不执行属性方法的情况下复制具有属性方法的原型?

【问题讨论】:

  • Object.create()有问题吗?
  • 您可以使用TestObject作为新对象的原型。

标签: javascript prototype clone


【解决方案1】:

我认为您正在寻找新的 ES6 Object.assign 函数。

当然,有一个更简单的方法可以解决您的问题 - 只是不要访问和设置属性,复制它们的 property descriptors

function extractPrototype(clazz) {
    var proto = {};
    for (var key in clazz.prototype) {
        Object.defineProperty(proto, key, Object.getOwnPropertyDescriptor(clazz.prototype, key));
    }
    return proto;
}

【讨论】:

  • 除了不执行get方法之外,这个结果与原始版本有什么不同吗?谢谢!
  • 是的,它还会复制每个属性的writableconfigurable 属性。
  • 啊,我认为这会破坏方法。这个怎么样: var getter = clazz.prototype.__lookupGetter__(key); var setter = clazz.prototype.__lookupSetter__(key); if ( getter || setter ) { Object.defineProperty(proto, key, Object.getOwnPropertyDescriptor(clazz.prototype, key)); } else { proto[key] = clazz.prototype[key]; }
  • @daw:“这会破坏方法”是什么意思?而__lookup%etter__ 多年来已被弃用。
猜你喜欢
  • 2014-02-18
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 2012-12-22
  • 2016-08-05
  • 1970-01-01
相关资源
最近更新 更多