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

在构造函数中声明javascript对象方法与在Prototype中声明

在构造函数中声明javascript对象方法与在Prototype中声明

翻翻过去那场雪 2019-07-22 10:41:09
在构造函数中声明javascript对象方法与在Prototype中声明在创建javascript对象时,我可以将方法声明放入构造函数或原型中。例如,假设我想要一个具有name属性和Bark方法的Dog类。我可以将Bark方法的声明放入构造函数中:var Dog = function(name) {     this.Name = name;     this.Bark = function() {         alert(this.Name + " bark");     };}或者我可以把它作为原型对象的一种方法:var Dog = function(name) {     this.Name = name;}Dog.prototype.Bark = function() {     alert(this.Name + " bark");};当我实例化Dog类型的对象时,这两种方法似乎都很好:var dog = new Dog("Fido");dog.Bark();  //Both approaches show "Fido bark"我应该更喜欢这些方法中的一种而不是另一种吗?使用一种比另一种更有好处吗?在幕后,这两种方法最终会做完全相同的事情吗?大多数人倾向于采用哪种方法?谢谢你的帮助。
查看完整描述

3 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

两者是不同的:第一个将存储对该方法的引用。在原型对象上,而第二个解决方案则将方法存储在物体的。这意味着每个对象将包含一个额外的指针,因此每个对象占用更多的内存。

每个对象方法允许该方法引用构造函数中的变量(闭包),因此它允许您访问一些无法从原型方法访问的数据。

最后,一个原型方法可以后来变了,那就是你可以重新定义Bark在运行时,对Prototype对象进行此更改,此更改将适用于该原型的所有对象(因为方法总是通过原型查找)。


查看完整回答
反对 回复 2019-07-22
?
绝地无双

TA贡献1946条经验 获得超4个赞

我看到的绝大多数javascript代码都使用原型方法。我认为有三个原因,我可以想到我的头顶。

第一,避免让每个类都成为一个巨大的构造函数:构造函数逻辑在构造函数中,其他方法的逻辑在其他地方声明-这主要是一个清晰的东西/关注点的分离,但是在javascript中,你需要尽可能的清晰。

二是效率。在构造函数中声明方法时,您将为对象的每个实例创建一个函数对象的新实例,并将构造函数的作用域绑定到这些函数中的每一个(也就是说,它们可以将参数引用到构造函数,只要该对象存在,构造函数就永远不可能被GC_d_当您在原型上声明方法时,所有实例都使用函数对象的一个副本-Prototype属性不会复制到实例中。

第三个原因是,当您使用Prototype方法时,可以各种方式“扩展”一个类,例如Backbone.js和CoffeeScript的类构造所使用的原型链接。


查看完整回答
反对 回复 2019-07-22
  • 3 回答
  • 0 关注
  • 320 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号