js原型的一些理解

调原型中方法时怎样把当前对象传进去?

声明一个对象,对象默认有__proto__属性,指向其原型

1
2
3
let obj = {}

obj.__proto__ === window.Object.prototype //true

改变 obj 的 __proto__ 属性指向

1
2
3
4
5
6
7
8
9
let 共有属性 = {
hi(){
console.log('hi')
}
}
let obj = {}
obj.__proto__ = 共有属性

obj.hi() //hi

调共有属性中的hi时,hi怎样获取到对象 obj?
obj 作为第一个参数传给 hi 了吗:

1
2
3
4
5
6
7
8
9
let 共有属性 = {
hi(a){
console.log(a)
}
}
let obj = {}
obj.__proto__ = 共有属性

obj.hi() //undefined

实际上必须通过this拿到,或者理解为参数a前面还有一个看不见的参数this

1
2
3
4
5
6
7
8
9
let 共有属性 = {
hi(/*this,*/a){
console.log(this)
}
}
let obj = {}
obj.__proto__ = 共有属性

obj.hi() //{}

可以借助python理解一下:
python 显式的将第一个参数写为self,而javascript将this隐藏起来,但依然可以在调用方法时通过 this 将对象传入方法中。

1
2
3
4
5
6
7
class MyClass:
"""A simple example class"""
def hi(self):
return self

x = MyClass()
x.hi()