一.JS的类和对象
1.用CLASS,声明一个类,类名依然大写
2.类里面有个constructor函数,可以接收传递过来的参数,同时返回实例对象
3.constructor函数不需要加function!!!!!!!!!!!!!!!!!!!!!!
4.constructor函数只要new生成实例时,就会被调用
5.!!!!!!!!!类名后没有小括号()!!!!!!!!!!!!!!
二.关于构造函数
1.构造函数里的属性和方法称为成员,成员可以添加
2.构造函数的静态成员和实例成员
3.构造函数里可以添加一些成员,可以在构造函数本身上添加,也可以在构造函数内部的this上添加
4.一定要实例化对象!!!!!!!!!!!!!!!!!!!!!!!!!!
三.关于prototype,--proto--
1.构造函数具有prototype,对象具有--proto—属性
2.每一个构造函数都有一个prototype属性,指向另一个对象,这个对象所有的属性和对象都会被构造函数所拥有
3.一般情况下,公共的方法放在原型对象上,公共的属性放在构造函数里
之所以,s1能够访问Way1,是因为s1存在--proto--属性指向构造函数的原型对象
注意到,Way的原型对象等于s1的对象原型
方法的查找规则:
先看s1本身有无方法,如果有就执行,没有,就去构造函数的原型对象(Way.prototype)身上去找
原型对象的constructor属性:
constructor属性指向构造函数,记录该对象引用于哪个构造函数
很多情况下,需要手动把constructor属性指回原来的构造函数
成员查找机制:
按照原型链,对象本身没有的话,找对象的--proto--,再没有,找--proto--,直到null
利用原型对象扩展内置对象方法:
四.关于this指向
1.单独的this,指向windows对象 alert(this) //this-->window
2.全局函数中的this,指向window对象
function demo (){
alert(this)}
// this-->window
demo()
3.严格模式下,undefined
function demo ( ) {
'use strict'
alert(this) //undefined
}
demo()
4.构造函数里的this,指向实例化对象(构造函数的原型对象的this也是一样指向)
function demo (){
//alert(this) //this-->object
this.testStr = 'this is a test'
}
let a = new demo()
alert(a.testStr)
5.call方法里的this
function demo () {
alert(this)
}
demo.call('abc') //abc
demo.call(null) //this-->window
demo.call(undefined) //this-->undefined