オブジェクトのプロトタイプオブジェクト

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) }
})

おすすめ

転載: blog.csdn.net/m0_53149377/article/details/127766612