javascript 原型和原型链

使用构造函数创建对象的缺点

使用构造函数创建对象时,每创建一个对象,就会在堆内存中开辟一份空间,把构造函数的所有属性和方法都放到该内存空间中,存在内存浪费的问题

原型的作用

每一个函数在创建时,解析器都会向函数中添加属性 prototype ,该属性对应一个对象,即原型对象

  • 当函数作为普通函数调用时,prototype没有任何作用
  • 当函数作为构造函数被调用时,它所创建的对象中都会有一个隐含的属性指向该该构造函数的原型对象,可以通过__proto__来访问该属性,因此,可以把实例对象共享的方法放到构造函数的原型对象上,节约内存
var  per = new Person();     
//Person()作为构造函数被调用,Person()中有一个属性prototype
//创建的对象per中,有一个隐含的属性__proto__指向Person()的原型对象
per.__proto__ === Person.prototype           //true

原型链

原型对象也是对象,所以它也有原型

  • 当读取一个对象的属性或方法时,它会先在对象自身中找,如果有,则直接使用,如果没有则去原型对象中找;如果原型对象中有,则直接使用,如果没有则去原型的原型中找(per.proto.proto),如果找到,则直接使用,如果最终没找到,则返回undefined;
  • 构造函数的prototype属性:显式原型,默认指向一个空的Object对象;
  • 实例对象的__proto__属性:隐式原型
  • 读取对象的属性值时,会自动到原型链中查找,但设置对象的属性值时,不会查找原型链,如果当前对象中没有此属性,则直接添加此属性并设置其值

原型继承

  • js的原型继承是把父类的原型放到子类的原型链上,子类实例想访问父类的方法和属性,需要基于__proto__原型链查找机制完成;
  • 子类也可以重写父类上的方法,但这样会导致父类其他的实例也受到影响;
  • 父类中私有或公有的属性或方法都会变为子类中公有的属性和方法
function A(x){
    this.x = x;
}
A.prototype.getX = function(){
	...
    return this.x;
};
function B(y){
    this.y = y;
}
//B.prototype指向一个空的Object对象
B.prototype = new A(20);
//B.prototype指向A的实例对象
B.prototype.getY = function(){
	...
    return this.y;
}
var b = new B(10);
console.log(b.x);       //20
console.log(b.y);       //10
b.getX();         //20
b.getY();         //10

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值