浅谈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 相关文章推荐
jquery ajax 同步异步的执行示例代码
Jun 23 Javascript
js怎么终止程序return不行换jfslk
May 30 Javascript
删除javascript中注释语句的正则表达式
Jun 11 Javascript
Javascript基础教程之argument 详解
Jan 18 Javascript
Highcharts入门之基本属性
Aug 02 Javascript
深入理解jQuery layui分页控件的使用
Aug 17 Javascript
Centos7 中安装 Node.js v4.4.4
Nov 03 Javascript
vue 权限认证token的实现方法
Jul 17 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
Nov 26 Javascript
bootstrap table实现合并单元格效果
Dec 24 Javascript
JavaScript变量提升和严格模式实例分析
Jan 27 Javascript
js实现图片上传到服务器和回显
Jan 19 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
PHP 文件系统详解
2012/09/13 PHP
php ZipArchive压缩函数详解实例
2013/11/06 PHP
PHP页面间传递值和保持值的方法
2016/08/24 PHP
jQuery学习笔记之jQuery构建函数的7种方法
2014/06/03 Javascript
js实现select组件的选择输入过滤代码
2014/10/14 Javascript
javascript实现动态改变层大小的方法
2015/05/14 Javascript
jQuery结合AJAX之在页面滚动时从服务器加载数据
2015/06/30 Javascript
jQuery实现径向动画菜单效果
2015/07/17 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
使用Angular缓存父页面数据的方法
2017/01/03 Javascript
jquery插件canvaspercent.js实现百分比圆饼效果
2017/07/18 jQuery
angular2路由切换改变页面title的示例代码
2017/08/23 Javascript
Seajs源码详解分析
2019/04/02 Javascript
小程序rich-text组件如何改变内部img图片样式的方法
2019/05/22 Javascript
axios实现文件上传并获取进度
2020/03/25 Javascript
Vue 中 template 有且只能一个 root的原因解析(源码分析)
2020/04/11 Javascript
[01:06:39]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第三局
2016/03/02 DOTA
[05:46]2018完美盛典-《同梦共竞》
2018/12/17 DOTA
python检测lvs real server状态
2014/01/22 Python
springboot配置文件抽离 git管理统 配置中心详解
2019/09/02 Python
Python实现Word表格转成Excel表格的示例代码
2020/04/16 Python
python构造IP报文实例
2020/05/05 Python
python2.7使用scapy发送syn实例
2020/05/05 Python
Pyinstaller 打包发布经验总结
2020/06/02 Python
如何基于Python爬虫爬取美团酒店信息
2020/11/03 Python
CSS3对图片照片进行边缘模糊处理的实现
2018/08/08 HTML / CSS
护理毕业生自荐信范文
2013/12/22 职场文书
五型班组建设方案
2014/02/10 职场文书
说明书范文
2014/05/07 职场文书
C++程序员求职信
2014/05/07 职场文书
环保建议书400字
2014/05/14 职场文书
我心目中的好老师活动方案
2014/08/19 职场文书
质检员岗位职责
2015/02/03 职场文书
致地震灾区的慰问信
2015/03/23 职场文书
会计试用期工作总结2015
2015/05/28 职场文书
终止解除劳动合同证明书
2015/06/17 职场文书