如何使用属性方法克隆原型?

时间:2015-03-27 10:40:28

标签: javascript prototype clone

我使用的是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

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

1 个答案:

答案 0 :(得分:2)

我认为您正在寻找新的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;
}