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

Javascript 如何使用属性方法克隆原型?,javascript,prototype,clone,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

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

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

我想您正在寻找新的ES6函数

当然,对于您的问题有一个更简单的解决方案-只是不访问和设置属性,而是复制它们的:


Object.create()
有问题吗?您可以使用TestObject作为新对象的原型。除了不执行get方法外,其结果是否与原始版本有任何其他不同?谢谢是的,它还复制每个属性的
可写
可配置
属性。啊,我认为这破坏了方法。这个怎么样:var getter=clazz.prototype.\uuu lookupGetter\uuuuu(键);变量设置器=分类原型。查找器(键);if(getter | | setter){Object.defineProperty(proto,key,Object.getOwnPropertyDescriptor(clazz.prototype,key));}else{proto[key]=clazz.prototype[key];}@daw:“这打破了方法”是什么意思?和
\uuu查找%etter\uuuu
自年以来已被弃用。
function extractPrototype(clazz) {
    var proto = {};
    for (var key in clazz.prototype) {
        Object.defineProperty(proto, key, Object.getOwnPropertyDescriptor(clazz.prototype, key));
    }
    return proto;
}