什么是构造函数?
构造函数首字母大写,普通函数是小写,其实和普通函数一样。
普通函数和构造函数的区别?
构造函数可以通过new关键字去调用,构造函数和普通函数一样,自身也是有prototype显示原型属性。
如何创建实例对象?
构造函数通过new关键字去调用返回一个实例对象,该实例对象有一个__proto__隐式原型属性,并自动继承构造函数的prototype原型对象。
原型
原型分两种 :prototype显式原型 、 __ proto__隐式原型
1. 函数:有一个prototype显式原型属性,默认指向一个空的Object对象。
2. 对象:有一个__proto__隐式原型属性,默认继承构造函数的显式原型属性。
构造函数Fun:
function Fun(){
console.log(this) // 指向new构造函数的实例对象funObj
this.name = '小明'
this.age = 100
}
Fun.prototype.code = '9993333' // 在构造函数的prototype显示原型对象添加code属性
Fun.prototype.age = '198' // 会被实例对象__proto__隐式原型对象添加age属性重新赋值
const funObj = new Fun(); //实例对象funObj:(new Fun构造函数返回的实例对象 )
funObj.__proto__.age = '199' // 在实例对象的__proto__隐式原型对象添加age属性
console.log(funObj.age, funObj.code, funObj.name) //100 199 小明 // 这个查找的过程就叫原型链
console.log(funObj.__proto__ === Fun.prototype) // true 构造函数的显性原型prototype ===实例对象funObj隐式原型 __ proto__
普通对象obj:
let obj = {name:'888'}
obj.__proto__.age = 20
console.log(obj.age) // 20 对象内部没有这个属性就去自己的原型上找
原型链
原理:当我们new一个构造函数,会返回一个新的实例对象,这个实例对象会继承构造函数的prototype原型属性;当我们访问实例对象上的属性时,如果没有这个属性,它就会往上(创建出它的函数中)查找,这个查找的过程就叫原型链。