Skip to content

Commit 44008e7

Browse files
akachingakaching
akaching
authored and
akaching
committed
1
1 parent 0dd648f commit 44008e7

File tree

5 files changed

+132
-23
lines changed

5 files changed

+132
-23
lines changed

defineProperty.js

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
let user = {
2+
nickname: 'youngoldman',
3+
age: 18,
4+
hobby: ['football', 'basketball'],
5+
say() {
6+
console.log('hello')
7+
}
8+
}
9+
10+
let tempName = user.nickname
11+
Object.defineProperty(user, 'nickname', {
12+
get() {
13+
// console.log('get', objname)
14+
// debugger
15+
return tempName
16+
},
17+
set(v) {
18+
tempName = v
19+
console.log('set', tempName)
20+
return tempName
21+
},
22+
})

index.html

+19-2
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,27 @@ <h1>debounce</h1>
2121
</body>
2222
<script src="./debounce.js"></script>
2323
<script src="./throttle.js"></script>
24-
<script src="./promise.js"></script>
24+
<!-- <script src="./promise.js"></script>
2525
<script src="./publish-subscribe.js"></script>
26-
<script src="./observer.js"></script>
26+
<script src="./observer.js"></script> -->
27+
<script src="./vm.js"></script>
2728
<script>
29+
let vm = new Vue({
30+
data: {
31+
message: 'hello',
32+
flag: true,
33+
list: [1,2,3],
34+
obj: {
35+
a: 1,
36+
b: 2,
37+
man: {
38+
c: 3,
39+
d: 4
40+
}
41+
}
42+
}
43+
})
44+
2845
const debounceInput = document.querySelector('#debounce')
2946
debounceInput.addEventListener('input', debounce((...args) => {
3047
console.log('debounce');

observer.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ try {
3535
a = 2
3636
console.log(a)
3737
} catch (error) {
38-
console.log(error.name)
39-
console.log(error.message)
38+
// console.log(error.name)
39+
// console.log(error.message)
4040
}
41-
throw new Error('错误信息')
41+
// throw new Error('错误信息')

throttle.js

+20-18
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
1-
// const throttle = (fn, delay = 1000) => {
2-
// let record = Date.now()
3-
// return function (...args) {
4-
// let now = Date.now()
5-
// if (now - record > delay) {
6-
// fn(...args)
7-
// record = Date.now()
8-
// }
9-
// }
10-
// }
11-
1+
// 判断时间法
122
const throttle = (fn, delay = 1000) => {
13-
let executed = false
3+
let record = Date.now()
144
return function (...args) {
15-
if (!executed) {
16-
setTimeout(() => {
17-
fn(...args)
18-
executed = false
19-
}, delay)
20-
executed = true
5+
let now = Date.now()
6+
if (now - record > delay) {
7+
fn(...args)
8+
record = Date.now()
219
}
2210
}
2311
}
12+
13+
// 定时器法
14+
// const throttle = (fn, delay = 1000) => {
15+
// let executed = false
16+
// return function (...args) {
17+
// if (!executed) {
18+
// setTimeout(() => {
19+
// fn(...args)
20+
// executed = false
21+
// }, delay)
22+
// executed = true
23+
// }
24+
// }
25+
// }

vm.js

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
class Vue {
2+
constructor(options) {
3+
this.$options = options
4+
this.$data = options.data
5+
this.$el = document.querySelector(options.el)
6+
this.initData()
7+
}
8+
9+
// 初始化数据
10+
initData() {
11+
let data = this.$data
12+
Object.keys(data).forEach(key => {
13+
defineReactive(this, key, data[key])
14+
// Object.defineProperty(this, key, {
15+
// enumerable: true,
16+
// configurable: true,
17+
// get() {
18+
// return data[key]
19+
// },
20+
// set(value) {
21+
// data[key] = value
22+
// },
23+
// })
24+
})
25+
// observe(data)
26+
}
27+
}
28+
29+
// 劫持数据对象
30+
const defineReactive = (obj, key, value) => {
31+
observe(value)
32+
Object.defineProperty(obj, key, {
33+
enumerable: true,
34+
configurable: true,
35+
get() {
36+
console.log(`${key}属性被访问了`)
37+
return value
38+
},
39+
set(val) {
40+
if (val === value) return
41+
console.log(`值发生了改变:${val}=>${value}`)
42+
value = val
43+
return value
44+
},
45+
})
46+
}
47+
48+
// // 判断数据是不是基本类型, 如果是基本类型则不进行递归, 否则进行递归
49+
const observe = data => {
50+
let type = Object.prototype.toString.call(data)
51+
if (type !== '[object Object]' && type !== '[object Array]') {
52+
return
53+
}
54+
new Observer(data)
55+
}
56+
57+
// 监听数据
58+
class Observer {
59+
constructor(data) {
60+
this.walk(data)
61+
}
62+
walk(data) {
63+
Object.keys(data).forEach(key => {
64+
let value = data[key]
65+
defineReactive(data, key, value)
66+
})
67+
}
68+
}

0 commit comments

Comments
 (0)