function Dog(uname,age){
this.uname = uname
this.age = age
this.eat = function (){
console.log('吃骨头')
}
}
const dog1 = new Dog('小白',3)
const dog2 = new Dog('大黄',5)
console.log(dog1.eat()===dog2.eat()) //false
内容一样,可是地址值却不一样,浪费内存。
原型(prototype):每一个构造函数都有一个prototype(原型)属性,该属性指向一个对象,所以也叫原型对象。当创建出来的对象访问某个方法,先在当前对象中查找是否有该方法,如果没有就到构造函数中查找,若构造函数中还是没有,就会到原型对象(prototype)中查找。所以,通过同一个构造函数创建出来的不同对象,若对象中和构造函数中都没有定义这个方法,最终都会找到原型对象上面,所以指向的是同一个方法,就会节省内存。
function Dog(uname,age){
this.uname = uname
this.age = age
}
Dog.prototype.eat = function(){
console.log('吃骨头')
}
const dog1 = new Dog('小白',3)
const dog2 = new Dog('大黄',5)
console.log(dog1.eat() === dog2.eat()) //true
原型对象上有一个constructor属性,指向构造函数(标记出来当前原型对象属于哪个构造方法的)
当
function Dog(){
}
const dog = new Dog()
Dog.prototype = function(){
console.log('吃骨头')
}
constructor属性就会丢失,指不会构造函数(当前例子中的Dog)
为什么实例对象可以访问到原型对象里的方法呢?
每一个对象里面都会有一个__proto__属性(只读属性,不能修改),该属性指向原型对象。原型对象里的属性和方法实例对象都可以访问到
console.log(dog.__proto__ === Dog.prototype)//true
对象原型(dog.__proto__)中也有一个constructor属性,指向创建该对象的构造函数。所以constructor就是指向构造函数(Dog)的。
instanceof原理:检查该对象的__proto__是否在构造函数的原型链上
console.log(dog instanceof Dog)