document.location
使用を観察できない理由は、 「標準」オブジェクトではなく、タイプのオブジェクト (特別な読み取り専用インターフェイス) を返すObject.observe()
ためだと思います。document.location
Location Object
Mozilla ドキュメントから:
Document.location 読み取り専用プロパティは Location オブジェクトを返します。Document オブジェクトの location プロパティは、Location オブジェクトを参照します。Window.location は読み取り専用の Location オブジェクトです。
ロケーション インターフェース:
https://developer.mozilla.org/en-US/docs/Web/API/Location
例:
console.log(document.location.__proto__); // returns Location {}
console.log(window.location.__proto__); // returns Location {}
window.location === document.location // always true
Object.observe() メソッドは、オブジェクトへの変更を監視するために使用されます。
例:
var o = { name: ''};
Object.observe(o, function(changes){
changes.forEach(function(change) {
console.log(change.type, change.name, change.oldValue);
});
});
o.name = 'foo'; // name is being observed
彼らの違いを見てください__proto__
console.log(document.location.__proto__); // returns Location {}
console.log(window.location.__proto__); // returns Location {}
console.log(o.__proto__); // returns Object {}
オブジェクトのプロトタイプ チェーンに、取得できるコンストラクターのプロトタイプ プロパティがあるかどうかをテストすると、非常に興味深いものになります。
console.log(document.location instanceof Object); // true
console.log(o instanceof Object); // true
コードサンプル:
var o = {
name: ''
};
Object.observe(o, function(changes) {
changes.forEach(function(change) {
console.log(change.type, change.name, change.oldValue);
});
});
o.name = 'foo';
console.log(document.location.__proto__); // returns Location {}
console.log(window.location.__proto__); // returns Location {}
console.log(o.__proto__); // returns Object {}
console.log(document.location instanceof Object); // true
console.log(o instanceof Object); // true