浅谈js构造函数的方法与原型prototype


Posted in Javascript onJuly 04, 2016

把方法写在构造函数内的情况我们简称为函数内方法,把方法写在prototype属性上的情况我们简称为prototype上的方法。

•函数内的方法: 使用函数内的方法我们可以访问到函数内部的私有变量,如果我们通过构造函数new出来的对象需要我们操作构造函数内部的私有变量的话, 我们这个时候就要考虑使用函数内的方法.

•prototype上的方法: 当我们需要通过一个函数创建大量的对象,并且这些对象还都有许多的方法的时候;这时我们就要考虑在函数的prototype上添加这些方法. 这种情况下我们代码的内存占用就比较小.

•在实际的应用中,这两种方法往往是结合使用的;所以我们要首先了解我们需要的是什么,然后再去选择如何使用

// 构造函数A
function A(name) {
  this.name = name || 'a';
  this.sayHello = function() {
    console.log('Hello, my name is: ' + this.name);
  }
}

// 构造函数B
function B(name) {
  this.name = name || 'b';
}
B.prototype.sayHello = function() {
  console.log('Hello, my name is: ' + this.name);
};

var a1 = new A('a1');
var a2 = new A('a2');
a1.sayHello();
a2.sayHello();

var b1 = new B('b1');
var b2 = new B('b2');
b1.sayHello();
b2.sayHello();

写了两个构造函数,第一个是A,这个构造函数里面包含了一个方法sayHello;第二个是构造函数B, 我们把那个方法sayHello写在了构造函数B的prototype属性上面.把方法写在构造函数的内部,增加了通过构造函数初始化一个对象的成本,把方法写在prototype属性上就有效的减少了这种成本. 你也许会觉得,调用对象上的方法要比调用它的原型链上的方法快得多,其实并不是这样的,如果你的那个对象上面不是有很多的原型的话,它们的速度其实是差不多的

另外,需要注意的一些地方:

•首先如果是在函数的prototype属性上定义方法的话,要牢记一点,如果你改变某个方法,那么由这个构造函数产生的所有对象的那个方法都会被改变.

•还有一点就是变量提升的问题,我们可以稍微的看一下下面的代码:

func1(); // 这里会报错,因为在函数执行的时候,func1还没有被赋值. error: func1 is not a function
var func1 = function() {
  console.log('func1');
};

func2(); // 这个会被正确执行,因为函数的声明会被提升.
function func2() {
  console.log('func2');
}

•关于对象序列化的问题.定义在函数的prototype上的属性不会被序列化,可以看下面的代码:

function A(name) {
  this.name = name;
}
A.prototype.sayWhat = 'say what...';

var a = new A('dreamapple');
console.log(JSON.stringify(a));

我们可以看到输出结果是{"name":"dreamapple"}

以上这篇浅谈js构造函数的方法与原型prototype就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
兼容多浏览器的字幕特效Marquee的通用js类
Jul 20 Javascript
javascript 命名空间以提高代码重用性
Nov 13 Javascript
jquery 新手学习常见问题解决方法
Apr 18 Javascript
js获取html页面节点方法(递归方式)
Dec 13 Javascript
javascript实现json页面分页实例代码
Feb 20 Javascript
js函数与php函数的区别实例浅析
Jan 12 Javascript
分享十五款 jQuery 社交网络分享插件
May 16 Javascript
javascript图片滑动效果实现
Jan 28 Javascript
js实现图片无缝滚动
Dec 23 Javascript
JavaScript实现简单的tab选项卡切换
Jan 05 Javascript
javascript原生ajax写法分享
Apr 10 Javascript
JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】
Jan 23 Javascript
全面了解js中的script标签
Jul 04 #Javascript
jQuery基础_入门必看知识点
Jul 04 #Javascript
把普通对象转换成json格式的对象的简单实例
Jul 04 #Javascript
JS实现n秒后自动跳转的两种方法
Nov 30 #Javascript
js输出数据精确到小数点后n位代码
Jul 02 #Javascript
学习Bootstrap滚动监听 附调用方法
Jul 02 #Javascript
JavaScript Ajax编程 应用篇
Jul 02 #Javascript
You might like
解析PayPal支付接口的PHP开发方式
2010/11/28 PHP
sae使用smarty模板的方法
2013/12/17 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
2014/07/18 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
2016/07/09 PHP
thinkPHP引入类的方法详解
2016/12/08 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
2017/02/03 PHP
PHP基于DOMDocument解析和生成xml的方法分析
2017/07/17 PHP
浅谈PHP各环境下的伪静态配置
2019/03/13 PHP
laravel ORM关联关系中的 with和whereHas用法
2019/10/16 PHP
JavaScript 学习笔记之语句
2015/01/14 Javascript
jQuery实现加入购物车飞入动画效果
2015/03/14 Javascript
jQuery如何使用自动触发事件trigger
2015/11/29 Javascript
详解Bootstrap glyphicons字体图标
2016/01/04 Javascript
理解javascript中的MVC模式
2016/01/28 Javascript
JavaScript直播评论发弹幕切图功能点集合效果代码
2016/06/26 Javascript
BootStrap glyphicon图标无法显示的解决方法
2016/09/06 Javascript
Angular.js实现注册系统的实例详解
2016/12/18 Javascript
关于vue-router的beforeEach无限循环的问题解决
2017/09/09 Javascript
微信小程序实现点击图片放大预览
2019/10/21 Javascript
vue quill editor 使用富文本添加上传音频功能
2020/01/14 Javascript
react+antd 递归实现树状目录操作
2020/11/02 Javascript
[03:38]2014DOTA2西雅图国际邀请赛 VG战队巡礼
2014/07/07 DOTA
深入理解Python中装饰器的用法
2016/06/28 Python
Python实现PS图像明亮度调整效果示例
2018/01/23 Python
Python使用遗传算法解决最大流问题
2018/01/29 Python
TensorFlow实现创建分类器
2018/02/06 Python
python图书管理系统
2020/04/05 Python
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
你可能不知道的Python 技巧小结
2020/01/29 Python
Python列表解析操作实例总结
2020/02/26 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
解决python便携版无法直接运行py文件的问题
2020/09/01 Python
Shopee马来西亚:随拍即卖,最佳行动电商拍卖平台
2017/06/05 全球购物
机关门卫制度
2014/02/01 职场文书
小学重阳节活动总结
2015/03/24 职场文书
如何使用PyCharm及常用配置详解
2021/06/03 Python