如何使用 属性 方法克隆原型?
How to clone a prototype with property methods?
我正在使用 Typed.React 库,其中包含一种方法,可以用另一个原型定义扩展一个原型定义:
function extractPrototype(clazz) {
var proto = {};
for (var key in clazz.prototype) {
proto[key] = clazz.prototype[key];
}
return proto;
}
如果提供的 class 定义了 属性 方法,则此函数具有执行 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.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;
}
我正在使用 Typed.React 库,其中包含一种方法,可以用另一个原型定义扩展一个原型定义:
function extractPrototype(clazz) {
var proto = {};
for (var key in clazz.prototype) {
proto[key] = clazz.prototype[key];
}
return proto;
}
如果提供的 class 定义了 属性 方法,则此函数具有执行 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.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;
}