我有一个对象。
const ab = {
method: function() {
},
method1 : function () {
}
}
我想构建一个将上述对象中的所有函数作为静态方法的类。
所以,如果我做了像
这样的事情Class Me extends ab;
应该等同于
Class Me {
static method() {}
static method1() {}
}
对此有何评论?
鉴于对象ab
对我来说是未知的(接受为输入而我需要返回该类),我怎样才能实现相同的目标?
我不想使用传统的基于function
的静态方法。
答案 0 :(得分:1)
在Javascript中,您只需创建一个在其原型链中给定对象的新对象。处理裸对象时最简单的方法是
const ab = {
method: function() {
return 1;
},
method1 : function () {
}
}
const ac = Object.create(ab);
console.log(ab.method());
console.log(ac.method());

新创建的ac
对象的行为类似于您要求的带有静态方法的类。
设置明确的原型链的好处是,您稍后在ab
中修改的成员将反映在ac
中。
编辑如注释中所指出的,如果你想要一个类(它将像一个构造函数),你需要一个具有从源对象复制的属性的函数:
const ab = {
method: function() {
return 1;
},
method1 : function () {
}
}
function Me() {}
// dummy member to show that Me is a class
Me.prototype.foo = function() { return 2; }
// assign static methods
Object.assign(Me, ab);
// Me is a class
var m = new Me();
console.log( m.foo() );
// but has static methods
console.log( Me.method() );

答案 1 :(得分:0)
const ab = {
method: function() {
},
method1 : function () {
}
};
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype = Object.assign({}, ab);
/* Instantiate the class. */
var alice = new Person('Alice', 93);
var bill = new Person('Bill', 30);

答案 2 :(得分:0)
一种可能的方法是使用所谓的class expression作为Object.assign的参数。例如:
const _extra = {
doSomethingExtra: function() {
console.log('doSomethingExtra');
}
};
class Base {
constructor(value) {
this.value = value;
}
doSomething() {
console.log('doSomething with ' + this.value);
}
}
const Extra = Object.assign(class Extra extends Base {}, _extra);
const extra = new Extra(42);
extra.doSomething();
console.log(extra.constructor.name); // Extra
Extra.doSomethingExtra();
答案 3 :(得分:0)
使用回答https://stackoverflow.com/a/48809342/1503495
中的技巧这个衬里对我来说似乎很完美。
Object.assgin(Me, ab);
如果我已经有了Me
的其他方法,并且我想在这些方法之上进行扩展,那么这样做的好处就是增加了。因此,可读性和阶级爱情不会受到损害。