如何从一个对象扩展?

时间:2018-02-15 13:47:59

标签: javascript

我有一个对象。

const ab = {
  method: function() {
  },
  method1 : function () {
  }
}

我想构建一个将上述对象中的所有函数作为静态方法的类。

所以,如果我做了像

这样的事情
Class Me extends ab;

应该等同于

Class Me {
  static method() {}
  static method1() {}
}

对此有何评论?

鉴于对象ab对我来说是未知的(接受为输入而我需要返回该类),我怎样才能实现相同的目标?

我不想使用传统的基于function的静态方法。

4 个答案:

答案 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的其他方法,并且我想在这些方法之上进行扩展,那么这样做的好处就是增加了。因此,可读性和阶级爱情不会受到损害。