JS前端:原型链继承(每日一知识点)

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值