为了账号安全,请及时绑定邮箱和手机立即绑定

javascript 为什么要使用 prototype

标签:
JavaScript

答案:节省内存占用

没有 prototype 会有什么问题?

考虑一下我们在 js 中如何创建类的实例对象?先定义一个方法 Person,然后使用 new 关键词调用这个方法,我们先创建一个实例对象 freeman,然后再创建一个实例对象 newton,我们按照  Java 或者 C# 等面向对象语言的思路去考虑,我们会认为同样是人这个类的两个不同实例 freeman 和 newton,是不是应该具有同样的行为(此处是 eat 和 drink),但很不幸,如果使用这样的方法在 js 中创建这两个对象,他们的这两个行为没有半毛钱关系,为什么?因为创建这两个对象时都分别创建了自己的方法,只是名字相同而已(仅此而已)。考虑一个场景,如果我们需要创建一堆这样的实例的时候,我们每个实例都在重复创建这些方法,你会发现内存在持续增长。尤其是对于 virtual DOM 中的 element,如果每个
element 都有自己的一套方法,那对于一个普通的 html 文档来说,背后的 DOM 将占用大量的内存,从而影响到 js 的效率。

function Person(name) {  this.name = name;  this.eat = function () { console.log('eat apple.') };  this.drink = function() { console.log("drink water.")  };
}var freeman = new Person('freeman');var newton  = new Person('Newton')

freeman.eat   === newton.eat     // falsefreeman.drink === newton.drink   // false

为什么引入 prototype?

为了解决第一节中提到的问题,javascript 引入了 prototype 的概念,每个方法都默认由 javascript 执行环境添加一个 prototype 属性,这个属性本身是一个 object 对象,所以我们可以在这个 prototype 属性上添加她的属性和方法,只要使用 new 关键词创建的实例默认都集成这个 prototype 上定义的属性和方法(类似 OO 语言中的实例方法),这样无论你创建多少个实例对象,他们的行为(方法)都只有一个 blueprint,不会重复创建。

function Person(name) {  this.name = name;
}
Person.prototype.eat = function() {}
Person.prototype.eat = function() {}var freeman = new Person('freeman');var newton  = new Person('Newton')

freeman.eat   === newton.eat     // truefreeman.drink === newton.drink   // true



作者:我是柯南
链接:https://www.jianshu.com/p/e3b6ef04eda4


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消