obj.xxx();
オブジェクトのメソッドを呼び出すときは、まずオブジェクト自体でメソッドを見つけます。メソッドがあれば呼び出しは成功します。メソッドがない場合は、プロトタイプに到達したら、__proto__ で構成されるプロトタイプ チェーンに沿ってメソッドの検索を続けます。チェーン エンドポイントが見つからない場合、エラーが報告されます。
Object.prototype.constructor
Object.prototype.toString()
Object.prototype.toLocaleString()
Object.prototype.hasOwnProperty()
Object.prototype.isPrototypeOf()
var obj = { name: '李煜', age: 30, run: () => { console.log('running'); }, };
obj.run();
console.log(obj.toString());
オブジェクトにプロパティが存在するかどうかを判断します。
1. hasOwnProperty() は、オブジェクトにプロパティが存在するかどうかを判断するときに、プロトタイプ チェーンに沿って検索しません (オブジェクト自体のみを検索します)。
var obj = { name: '李煜', age: 30, run: () => { console.log('running'); }, };
if (obj.hasOwnProperty('toString')) {
// if( 'toString' in obj ){
console.log('在obj身上');
} else {
console.log('不在obj身上');
}
2. オブジェクトに属性が存在するかどうかを判断するとき、プロトタイプチェーンに沿って検索します。
var obj = { name: '李煜', age: 30, run: () => { console.log('running'); }, };
//if (obj.hasOwnProperty('toString')) {
if( 'toString' in obj ){
console.log('在obj身上');
} else {
console.log('不在obj身上');
}
isPrototypeOf() オブジェクトが特定の関数のプロトタイプ オブジェクトであるかどうかを判断します。
結論: js 内の任意のオブジェクトは、Object のトップレベル コンストラクターのインスタンス オブジェクトと見なすことができます。
var obj = { name: '李煜', age: 30, run: () => { console.log('running'); }, };
if( Array.prototype.isPrototypeOf( Object ) ){
// if (Object.prototype.isPrototypeOf(RegExp)) {
console.log('是');
} else {
console.log('不是');
}
var obj = { name: '李煜', age: 30, run: () => { console.log('running'); }, };
// if( Array.prototype.isPrototypeOf( Object ) ){
if (Object.prototype.isPrototypeOf(RegExp)) {
console.log('是');
} else {
console.log('不是');
}
var obj = { name:'李煜',age:30, father:{ name:'',age:90, son:{name:'',age:10} } };
console.log( obj );
Object.defineProperty(obj, 'name', {
// writable:true,
set: function( newValue ){ //在set函数中不能 执行针对该属性的赋值操作,会导致函数的递归调用.
console.log('修改了name属性的值',newValue);
},
get: function(){ //在get函数中不能 执行获取该属性的操作, 会导致函数的递归调用.
console.log('获取了name属性的值');
return '李煜'+'!!!';
},
})
オブジェクトのすべてのプロパティを監視する
アイデア:
1. for in を使用して最初にオブジェクトを走査し、オブジェクトの各プロパティを取得します。
2. Object.defineProperty を使用してオブジェクトの各プロパティの監視を設定します。
作用: 传入一个对象, 对该对象的每个属性进行遍历并且监听.
function listenObj(obj){
for(var key in obj){
if( typeof obj[key] == 'object' ){ //如果某个属性是引用类型, 则递归遍历该属性
listenObj(obj[key]) //递归遍历该属性
}else{ //不是引用类型
Object.defineProperty(obj, key , {
set:()=>{ console.log('修改了属性的值'); },
get:()=>{ console.log('获取了属性的值'); }
})
}
}
}
listenObj(obj)
プロキシー
var obj = { name: '李玉', age: 0, father: { name: '', age: 10 }, list: [] }
// new Proxy(对象, { set,get }) 实现了对象的整体监听, 不需要再写循环遍历+递归调用
// new Proxy 本质是对原有对象进行了一层包装, 生成一个新的包装对象, 这个包装对象实现了对象的监(并不是直接对原有对象进行监听 )
// oobj 是原有对象obj的 代理对象
console.log(obj);
var oobj = new Proxy(obj, {
set: (a, b, c) => { console.log('修改了obj对象', a, b, c) },
get: (a, b, c) => { console.log('获取了obj对象', a, b, c) }
})