ECMA6内の別のオブジェクトでオブジェクトを拡張する際に問題が発生しています。問題のオブジェクトを拡張した後、更新されたオブジェクトでメソッドを見つけることができないと言います。ここに私のコードは次のとおりです。Javascriptでオブジェクトを拡張する際の問題ECMA6
Subjectクラス:
// Subject to be observed
class Subject {
constructor() {
this.observers = new ObserverList();
}
addObserver(observer) {
this.observers.add(observer);
}
removeObserver(observer) {
this.observers.removeAt(this.observers.indexOf(observer, 0));
}
notify(context) {
for(let i = 0; i < this.observers.count(); i++) {
this.observers.get(i).update(context);
}
}
}
、オブジェクトが拡張され、私のコード:
/**
* Function to extend an object with another object
*/
function extend(obj, extension) {
Object.assign(obj, extension);
}
// Get our DOM elements
let controlCheckbox = document.getElementById("mainCheckbox"),
addBtn = document.getElementById("addNewObserver"),
container = document.getElementById("observersContainer");
// Concrete subject
// extend controlling checkbox with Subject class
extend(controlCheckbox, new Subject());
// Clicking the checkbox will trigger notifications to it's observers
controlCheckbox.onclick =() => {
controlCheckbox.notify(controlCheckbox.checked);
};
addBtn.onclick = addNewObserver;
function addNewObserver() {
let check = document.createElement('input');
check.type = 'checkbox';
extend(check, new Observer());
check.update = function(value) {
this.checked = value;
};
controlCheckbox.addObserver(check);
container.appendChild(check);
}
onclick
が発射された場合、方法controlCheckbox.addObserver
が定義されていないことを言っています。 controlCheckbox
オブジェクトを表示するためにブレークポイントを追加しました。そのメソッドがプロトタイプで使用可能であることがわかります。これはうまくいかないでしょうか?私が間違っているところを誰かが指摘できますか?
* "Object.assign()メソッドは、列挙可能なプロパティと独自のプロパティをソースオブジェクトからターゲットオブジェクトにのみコピーします。" * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign –
ES2015では、なぜサブクラスを作成するために適切な 'extends'キーワードを使用していないのか分かりません。 – Alnitak
サブクラスではありませんか? Subjectクラスを継承する必要があるDOM要素オブジェクトです – devoncrazylegs