javascript 将共享属性迁移到原型中去的实现方法


Posted in Javascript onAugust 31, 2016

当我们用一个构造函数创建对象时,其属性就会被添加到this中去。并且被添加到this中的属性实际上不会随着实体发生改变,这时,我们这种做法显得会很没有效率。例如:

function her(){
  this.name = 'Anna';
}

这意味着每次我们new her()创建一个实例对象的时候都会生成一个全新的name属性,并在内存中拥有属于该属性自己的存储空间。而事实上,我们可以将name属性添加到原型上去,这样一来所有实例都可以共享这个name属性了:

function her(){}
her.prototype.name = 'Anna';

这样一来,我们再用new her()创建对象的时候,name属性就不再是新对象的私有属性了,而是被添加到该对象的原型中去了。虽然这种做法会很有效率,但这也是针对实例对象中的不可变属性而言的,这是一定的不然的话改一下这个属性,所有被创建的新对象的这个属性都会被改变,这可不是我们想要的啊~~~。对象的公有属性尤其适合这种方法。

下面,我们来改进以前的一个例子:

function her(){};
her.prototype.name = 'Anna';
her.prototype.toString = function(){
  return this.name;
}

function his(){};
his.prototype = new her();
his.prototype.constructor = his;
his.prototype.sex = 'women';

如您所见,通常我们在进行原型对象扩展之前,我们现完成了相关继承工作的构建,否则his.prototype中后续新的属性方法有可能会抹掉继承来的东西。

function child(f, m){
  this.eat = f;
  this.don = m;
}
child.prototype = new his();
child.prototype.constructor = child;
child.prototype.name = 'Jok';
child.prototype.fun = function(){
  return this.eat + this.don
}

如您所见,实际上调用toString()这个方法的区别仅仅在于幕后的少量操作。主要区别也就是属性,方法的查找工作将更多地发生在her.prototype中。

以上这篇javascript 将共享属性迁移到原型中去的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
ppk谈JavaScript style属性
Oct 10 Javascript
jQuery生成asp.net服务器控件的代码
Feb 04 Javascript
js两行代码按指定格式输出日期时间
Oct 21 Javascript
jQuery实现密保互斥问题解决方案
Aug 16 Javascript
json格式的时间显示为正常年月日的方法
Sep 08 Javascript
Javascript变量作用域详解
Dec 06 Javascript
浅谈关于JavaScript API设计的一些建议和准则
Jun 24 Javascript
AngularJS 依赖注入详解和简单实例
Jul 28 Javascript
一篇文章搞定JavaScript类型转换(面试常见)
Jan 21 Javascript
详谈jQuery中的一些正则匹配表达式
Mar 08 Javascript
jquery radio 动态控制选中失效问题的解决方法
Feb 28 jQuery
js中怎么判断两个字符串相等的实例
Jan 17 Javascript
使用vue编写一个点击数字计时小游戏
Aug 31 #Javascript
原生js实现tab选项卡切换
Mar 23 #Javascript
jquery的checkbox,radio,select等方法小结
Aug 30 #Javascript
Javascript日期格式化format函数的使用方法
Aug 30 #Javascript
浅析ES6的八进制与二进制整数字面量
Aug 30 #Javascript
AngularJS轻松实现双击排序的功能
Aug 30 #Javascript
jQuery simpleModal插件的使用介绍
Aug 30 #Javascript
You might like
使用PHP维护文件系统
2006/10/09 PHP
php抓取https的内容的代码
2010/04/06 PHP
PHP 获取文件路径(灵活应用__FILE__)
2013/02/15 PHP
Laravel事件监听器用法实例分析
2019/03/12 PHP
jquery入门—编写一个导航条(可伸缩)
2013/01/07 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
Angularjs中UI Router全攻略
2016/01/29 Javascript
jQuery hover事件简单实现同时绑定2个方法
2016/06/07 Javascript
微信小程序 网络请求(GET请求)详解
2016/11/16 Javascript
Javascript中的getter和setter初识
2017/08/17 Javascript
JS实现元素上下左右移动效果
2017/10/18 Javascript
详解webpack打包nodejs项目(前端代码)
2018/09/19 NodeJs
vue获取data数据改变前后的值方法
2019/11/07 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
[43:48]Ti4正赛第一天 VG vs NEWBEE 2
2014/07/19 DOTA
[01:45]DOTA2新英雄“神谕者”全方位展示
2014/11/21 DOTA
[01:15:56]2018DOTA2亚洲邀请赛3月30日 小组赛A组 TNC VS Newbee
2018/03/31 DOTA
精确查找PHP WEBSHELL木马的方法(1)
2011/04/12 Python
Python中defaultdict与lambda表达式用法实例小结
2018/04/09 Python
pandas 空数据处理方法详解
2019/11/02 Python
python反转列表的三种方式解析
2019/11/08 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
Pytorch之Variable的用法
2019/12/31 Python
python实现三壶谜题的示例详解
2020/11/02 Python
html5触摸事件判断滑动方向的实现
2018/06/05 HTML / CSS
Html5页面获取微信公众号的openid的方法
2020/05/12 HTML / CSS
美国东北部户外服装和设备零售商:Eastern Mountain Sports
2016/10/05 全球购物
Diesel美国网上商店:意大利牛仔时装品牌
2020/12/10 全球购物
中学生差生评语
2014/01/30 职场文书
寒假家长评语大全
2014/04/16 职场文书
2015年校务公开工作总结
2015/05/26 职场文书
Oracle笔记
2021/04/05 Oracle
Idea连接MySQL数据库出现中文乱码的问题
2021/04/14 MySQL
springcloud之Feign超时问题的解决
2021/06/24 Java/Android
基于Pygame实现简单的贪吃蛇游戏
2021/12/06 Python
Tomcat项目启动失败的原因和解决办法
2022/04/20 Servers