Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用ES6类实例属性和方法扩展对象_Javascript_Ecmascript 6_Ecmascript 5_Es6 Class - Fatal编程技术网

Javascript 如何使用ES6类实例属性和方法扩展对象

Javascript 如何使用ES6类实例属性和方法扩展对象,javascript,ecmascript-6,ecmascript-5,es6-class,Javascript,Ecmascript 6,Ecmascript 5,Es6 Class,我正在从旧的ES5代码库中重构一些代码,我在那里做了以下工作: function ObjectCreatorFunction() { this.someProperty= {}; } /* * Static method, to extend the object passed as a parameter with the * ObjectCreatorFunction instance properties and methods */ ObjectCreatorFunction

我正在从旧的ES5代码库中重构一些代码,我在那里做了以下工作:

function ObjectCreatorFunction() {
  this.someProperty= {};
}

/*
 * Static method, to extend the object passed as a parameter with the
 * ObjectCreatorFunction instance properties and methods
 */
ObjectCreatorFunction.extend = function extend(object) {
  var key;

  ObjectCreatorFunction.call(object);
  for (key in ObjectCreatorFunction.prototype) {
    if (ObjectCreatorFunction.prototype.hasOwnProperty(key)) {
      if (!object.hasOwnProperty(key)) {
        object[key] = ObjectCreatorFunction.prototype[key];
      }
    }
  }

  return object;
};

ObjectCreatorFunction.prototype.someMethod = function someMethod() {...}
//etc
我正试图对ES6进行同样的重写,所以我有一个

class ClassName{
  constructor() {
    this.someProperty= {};
  }

  static extend(object) {
    let key;

    ClassName.constructor.call(object);
    for (key in ClassName.prototype) {
      if (ClassName.prototype.hasOwnProperty(key)) {
        if (!object.hasOwnProperty(key)) {
          object[key] = ClassName.prototype[key];
        }
      }
    }

    return object;
  }

  someMethod() {...}
  //etc
}
我的问题是那条线
ClassName.constructor.call(对象)
未按预期工作,即传递的对象未获取类的实例属性

我尝试了几种方法来重写这个(甚至是一些非正统的方法),但都没有用

如何使用ES6扩展具有类实例属性的对象

免责声明:


我的代码是通过传输过程传递的,带有babel和webpack。如果它对类的内部工作方式有任何影响。

否,这不适用于
语法。这不仅仅是语法上的糖。原型继承保持不变,但实例的初始化工作方式现在有所不同,特别是对于继承的类,并且您不能在没有
new
的情况下调用构造函数而不创建新实例

我建议明确说明你的mixin,并给它一个
init
方法:

class Mixin {
    constructor(methods) {
        this.descriptors = Object.getOwnPrpertyDescriptors(methods);
    }
    extend(object) {
        for (const p of this.descriptors)) {
            if (Object.prototype.hasOwnProperty.call(o, p)) {
                if (process.env.NODE_ENV !== 'production') {
                    console.warn(`Object already has property "${p}"`);
                }
            } else {
                Object.defineProperty(o, p, this.descriptors[p]);
            }
        }
    }
}


“传递的对象没有得到类的实例属性”-真的,这是你唯一的观察结果吗?您没有得到任何异常吗?如果您想编写mixin,我建议不要对它们使用
class
语法<代码>函数
仍然很好。@Bergi按照我写这篇文章的方式,没有任何异常。传递的对象返回的值与它进入时的值相同。如果我以任何其他方式编写它,例如
ClassName.call(object)
new ClassName.call(object)
我得到
不能将类作为函数调用,并且
ClassName.call不是构造函数,这绝对是我所期望的,因为类的构造函数不仅仅是语法糖。此外,ES6中新增了仅可构造(需要
new
)函数和仅可调用(禁止
new
)函数之间的区别,例如
构造函数和方法。原型继承保持不变,但实例的初始化现在工作方式不同了,特别是对于继承类。我很感谢您花时间写这篇文章,但这引入了一个全新的“抽象”级别,我只是想知道是否有一种简单的方法可以实现ES5代码对类的效果。如果不可能,这是一个有效的答案,但我想了解原因。另外,我的代码是通过一个传输过程传递的,使用babel和webpack,不确定它是否会影响它。您还可以删除
Mixin
类的抽象,并将其全部转储到一个对象文本中。但是是的,您不能使用
来创建混音。
// define a mixin:
const xy = new Mixin({
    initXY() {
        this.someProperty= {};
    },
    someMethod() { … }
});
// and use it:
class ClassName {
    constructor() {
        this.initXY();
    }
}
xy.extend(ClassName.prototype);