浅谈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 相关文章推荐
推荐一些非常不错的javascript学习资源站点
Aug 29 Javascript
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
Jan 11 Javascript
浅谈angularJS 作用域
Jul 05 Javascript
JavaScript第一篇之实现按钮全选、功能
Aug 21 Javascript
浅谈Angular路由守卫
Aug 26 Javascript
图片懒加载imgLazyLoading.js使用详解
Sep 15 Javascript
详解Node 定时器
Feb 26 Javascript
ES6 系列之 Generator 的自动执行的方法示例
Oct 19 Javascript
vue项目打包后怎样优雅的解决跨域
May 26 Javascript
javascript中undefined的本质解析
Jul 31 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
Aug 03 Javascript
Node.js 中如何收集和解析命令行参数
Jan 08 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 session 错误
2009/05/21 PHP
解析PHP SPL标准库的用法(遍历目录,查找固定条件的文件)
2013/06/18 PHP
php根据分类合并数组的方法实例详解
2013/11/06 PHP
PHP数据库万能引擎类adodb配置使用以及实例集锦
2014/06/12 PHP
php限制上传文件类型并保存上传文件的方法
2015/03/13 PHP
PHP导入导出Excel代码
2015/07/07 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
jquery 简单应用示例总结
2013/08/09 Javascript
一个字符串反转函数可实现字符串倒序
2014/09/15 Javascript
JavaScript代码复用模式详解
2014/11/07 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
2016/06/02 Javascript
jQuery提示插件qTip2用法分析(支持ajax及多种样式)
2016/06/08 Javascript
jQuery 翻页组件yunm.pager.js实现div局部刷新的思路
2016/08/11 Javascript
利用n 升级工具升级Node.js版本及在mac环境下的坑
2017/02/15 Javascript
vue-router history模式下的微信分享小结
2018/07/05 Javascript
Vue-CLI3.x 设置反向代理的方法
2018/12/06 Javascript
js实现蒙版效果
2020/01/11 Javascript
一行JavaScript代码如何实现瀑布流布局
2020/12/11 Javascript
[47:03]完美世界DOTA2联赛PWL S3 access vs LBZS 第一场 12.20
2020/12/23 DOTA
python在非root权限下的安装方法
2018/01/23 Python
解决python3 网络请求路径包含中文的问题
2018/05/10 Python
python实现五子棋人机对战游戏
2020/03/25 Python
Python计算一个点到所有点的欧式距离实现方法
2019/07/04 Python
python实现跨excel sheet复制代码实例
2020/03/03 Python
Python短信轰炸的代码
2020/03/25 Python
Python 日期与时间转换的方法
2020/08/01 Python
Sunglasses Shop丹麦:欧洲第一的太阳镜在线销售网站
2017/10/22 全球购物
英国优质家居用品网上品牌:URBANARA
2018/06/01 全球购物
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
美国批发供应商:Kole Imports
2019/04/10 全球购物
《美丽的小兴安岭》教学反思
2014/02/26 职场文书
征婚广告词
2014/03/17 职场文书
五月的鲜花活动方案
2014/08/21 职场文书
PyMongo 查询数据的实现
2021/06/28 Python
SpringDataJPA在Entity中常用的注解介绍
2021/12/06 Java/Android
python中使用redis用法详解
2022/12/24 Redis