原型可以用来减少重复代码,节省内存空间:同一构造函数,不同实例之间,信息可以共享。
对象分为函数对象和普通对象,每一个对象上都有__proto__的属性,只有函数对象(箭头函数除外)上才有prototype属性。这个属性指向一个对象,这个对象的所有属性和方法都会被构造函数的实例所继承。
构造函数通过prototype指向原型对象
原型对象通过constructor指回构造函数
构造函数通过关键字new实例化成一个对象
实例化对象通过__proto__指向对应构造函数的原型对象。
function Animal () {}
Animal.prototype.age = 3
Animal.prototype.shout = 'hahahaha~'
Animal.prototype.sayName = function () {
console.log('hello, i am ', this.age)
}
let cat = new Animal()
let dog = new Animal()
cat.sayName() // hello, i am 3
console.log('dog shout:', dog.shout) // dog shout:hahahaha~
console.log(cat === dog) // false
console.log(cat.prototype ===dog.prototype) //true
console.log(Animal.prototype.constructor === Animal) // true
console.log(cat.__proto__ === Animal.prototype) // true
console.log(cat.__proto__) // {age: 3, shout: 'hahahaha~', sayName: ƒ, constructor: ƒ}
__proto__
查找实例方法用__proto__,当访问一个对象上没有的属性时,可是使用这个方法,去原型链上进行查找
prototype
JavaScript为prototype对象设置了三个方法,用来辅助prototype属性:
1)isPrototypeOf 用于检测某个对象的prototype是不是检测对象的原型,返回布尔值
Cat.prototype.isPrototypeOf(cat2) // 检测cat2是不是在Cat的原型链上
2)hasOwnProperty 用于检测对象的某个属性是否是自有属性而非继承属性,返回值为布尔值
cat.hasOwnProperty('name') //检测cat对象上有没有name属性
- in 用于判断实例是否具有某个属性,不管是私有还是继承来的,返回值为布尔值
"name" in cat //检测name属性有没有在cat对象中或cat所在对原型链上