浅谈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 相关文章推荐
js判断变量是否未定义的代码
Mar 28 Javascript
js控制鼠标事件移动及移出效果显示
Oct 19 Javascript
JavaScript编写简单的计算器
Nov 25 Javascript
Ionic如何创建APP项目
Jun 03 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
Mar 14 Javascript
ionic+AngularJs实现获取验证码倒计时按钮
Apr 22 Javascript
深入理解Commonjs规范及Node模块实现
May 17 Javascript
JavaScript 中Date对象的格式化代码方法汇总
Sep 06 Javascript
微信小程序模版渲染详解
Jan 26 Javascript
使用Angular CLI生成路由的方法
Mar 24 Javascript
JSON.stringify()方法讲解
Jan 31 Javascript
p5.js实现简单货车运动动画
Oct 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
一周让你学会PHP 不错的学习资料
2009/02/06 PHP
php简单实现快速排序的方法
2015/04/04 PHP
浅谈php7的重大新特性
2015/10/23 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
2016/09/11 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
2018/08/16 PHP
你的 mixin 真的兼容 ECMAScript 5 吗?
2013/04/11 Javascript
IE下双击checkbox反应延迟问题的解决方法
2014/03/27 Javascript
js实现精美的图片跟随鼠标效果实例
2015/05/16 Javascript
javascript获取重复次数最多的字符
2015/07/08 Javascript
JavaScript实现类似拉勾网的鼠标移入移出效果
2016/10/27 Javascript
node.js入门教程之querystring模块的使用方法
2017/02/27 Javascript
vue组件如何被其他项目引用
2017/04/13 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
2017/05/10 Javascript
Node.js简单入门前传
2017/08/21 Javascript
vue.js异步上传文件前后端实现代码
2017/08/22 Javascript
回顾Javascript React基础
2019/06/15 Javascript
JS实现网页端猜数字小游戏
2020/03/06 Javascript
[01:29:31]VP VS VG Supermajor小组赛胜者组第二轮 BO3第一场 6.2
2018/06/03 DOTA
Python 代码性能优化技巧分享
2012/08/07 Python
python print 按逗号或空格分隔的方法
2018/05/02 Python
python验证码识别教程之利用滴水算法分割图片
2018/06/05 Python
浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法
2019/10/25 Python
python实现同一局域网下传输图片
2020/03/20 Python
python如何删除文件、目录
2020/06/23 Python
美国本地交易和折扣网站:LocalFlavor.com
2017/10/26 全球购物
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
外包公司软件测试工程师
2014/11/01 面试题
回门宴新郎答谢词
2014/01/12 职场文书
护士自我鉴定总结
2014/03/24 职场文书
2014年工作总结与下年工作计划
2014/11/27 职场文书
导游词怎么写
2015/02/04 职场文书
2019年鼓励无偿献血倡议书
2019/09/17 职场文书
晶体管来复再生式二管收音机
2021/04/22 无线电
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python
SQL IDENTITY_INSERT作用案例详解
2021/08/23 MySQL
VUE递归树形实现多级列表
2022/07/15 Vue.js