hasOwnProperty
=> Object.prototype.hasOwnProperty() ->所有实例对象都可以访问
=> 作用: 判断属性或方法是不是对象本身自带的
=> 沿原型链上查找的方法不是它自身的
Object.defineProperty
作用: 1. 给对象动态添加属性
2. 将对象属性绑定到另一个对象上
3. 数据劫持-监听对象数据变化, 实现数据变化自动更新界面 (vue2.x实现原理应用)
语法:
Object.defineProperty(obj,属性,{})
作用1
<script>
let obj = {
name: 'jack',
age: 18,
}
let vm = {}
for (const key in obj) {
Object.defineProperty(vm, key, {
get() {
return obj[key]
},
set(newValue) {
if (obj[key] == newValue) {
return}
obj[key] = newValue
})
}
</script>
作用2
let obj = {
name:'jack',
age:18
}
let vm={}
for(let key in obj){
Object.defineProperty(vm,key,{
get(){
return obj[key]
},
set(newValue){
if(obj[key]==newValue){
return
}
obj[key] = newValue
const titleEle =document.querySelector('.titler')
titleEle.innerHTML = obj.name
}
})
}
console.log(vm.name)
vm.name = 'rose'
console.log(vm.age)
数据劫持
将obj对象的属性能过Object.defineProperty方法绑定到vm对象上,
转变成getter和setter方法.
vm对象数据变化,自动更新界面
vm.message = 'helloworld'
<div>内容</div>
<script>
let obj = {
message:''
}
let vm = {}
for(const key in obj){
Object.defineProperty(vm, key, {
get(){
return obj[key]
},
set(value){
obj[key] = value
// 更新div内容
document.querySelector('div').innerHTML = value
}
})
}
代理
<script>
function test1() {
let obj = {
name: 'jack',
age: 18,
}
let handler = {}
let proxyObj = new Proxy(obj, handler)
console.log('obj.name ', obj.name)
console.log('proxyObj.name ', proxyObj.name)
proxyObj.name = 'rose'
console.log('obj.name ', obj.name)
}
let obj = {
name: 'jack',
age: 18,
}
let handler = {
get(target, propery, receiver) {
console.log('target ', target)
console.log('propery ', propery)
console.log('receiver ', receiver)
return target[propery]
},
set(target, propery, value, receiver) {
console.log('set >>>');
console.log('target ', target)
console.log('propery ', propery)
console.log('value ', value)
console.log('receiver ', receiver)
target[propery] = value
}
}
let proxyObj = new Proxy(obj, handler)
proxyObj.age = 20
</script>
代理应用
</head>
<body>
<div></div>
<script>
let obj = {
message:''
}
let proxyObj = new Proxy(obj,{
get(target,propery){
return target[propery]
},
set(target,propery,value){
target[propery] = value
document.querySelector('div').innerHTML = value
}
})
proxyObj.message = 'hello'
</script>
代理Proxy与Object.definePropery区别
Object.definePropery 处理数组要特殊处理
代理Proxy 直接处理
深拷贝和浅拷贝
拷贝 - 复制对象
浅拷贝: 只复制一层对象
深拷贝: 复制得到完全不一样的对象
实现拷贝
<script>
function test1() {
let obj = {
name: 'jack',
age: 18,
fun: {
swiming: '游泳',
},
}
}
function test2() {
let obj = {
name: 'jack',
age: 18,
fun: {
swiming: '游泳',
},
}
newObj.name = 'rose'
newObj.fun.swiming = '打游戏'
console.log('newObj :',newObj.name, ' oldObj :',obj.name);
console.log('newObj fun :',newObj.fun.swiming, ' oldObj fun :',obj.fun.swiming);
console.dir(newObj);
console.dir(obj);
}
test2()
深拷贝
JSON对象
JSON.stringify(obj)
obj -> 字符串
注: 只能是Object形式对象不是Math,Date...
'{name:"jack",age:18,fun:{swiming:"游泳"}}' <- JSON字符串
JSON.parse(str)
字符串 -> obj
注: 字符串必须 是 json格式
<script>
function test1() {
let objStr = JSON.stringify(obj)
console.log(obj)
console.log(objStr, typeof objStr)
let str = '{"num":1001,"score":98}'
let obj1 = JSON.parse(str)
console.log(obj1)
console.log(obj1.num)
}
let obj = {
name: 'jack',
age: 18,
fun: {
swiming: '游泳',
},
say:function(){
console.log('说话');
},
score:undefined
}
let newObj = JSON.parse(JSON.stringify(obj))
newObj.name = 'rose'
newObj.age = 20
newObj.fun.swiming = '玩游戏'
console.dir(newObj)
console.dir(obj)
</script>
递归实现深拷贝
<script>
function cloneObj(obj){
let newObj = Array.isArray(obj)? []:{} // 存储拷贝的原对象属性方法
for(const key in obj){
if(obj[key] && typeof obj[key] === 'object'){
newObj[key] = cloneObj(obj[key])
}else{
newObj[key] = obj[key]
}
}
return newObj
}
let obj = {
name: 'jack',
age: 18,
fun: {
swiming: '游泳',
},
say: function () {
console.log('说话')
},
score: undefined,
}
let newObj = cloneObj(obj)
newObj.name = 'rose'
newObj.age = 20
newObj.score = 98
newObj.fun.swiming = '玩游戏'
console.dir(newObj)
console.dir(obj)
</script>