浅谈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 YUI 读码日记之 YAHOO.util.Dom - Part.2 0
Mar 22 Javascript
js 替换功能函数,用正则表达式解决,js的全部替换
Dec 08 Javascript
JavaScript之appendChild、insertBefore和insertAfter使用说明
Dec 30 Javascript
提示$ is not defined错误分析及解决
Apr 09 Javascript
jQuery 获取select选中值及清除选中状态
Dec 13 Javascript
Angular-Touch库用法示例
Dec 22 Javascript
Mongoose实现虚拟字段查询的方法详解
Aug 15 Javascript
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
Aug 16 Javascript
JavaScript中Require调用js的实例分享
Oct 27 Javascript
微信小程序websocket实现聊天功能
Mar 30 Javascript
Element输入框带历史查询记录的实现示例
Jan 15 Javascript
详解vue页面首次加载缓慢原因及解决方案
Nov 06 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里的JS打印函数
2006/10/09 PHP
ie6 动态缩略图不显示的原因
2009/06/21 PHP
CI框架在CLI下执行占用内存过大问题的解决方法
2014/06/17 PHP
php防止sql注入简单分析
2015/03/18 PHP
SSO单点登录的PHP实现方法(Laravel框架)
2016/03/23 PHP
JavaScript prototype属性使用说明
2010/05/13 Javascript
jQuery Tools tooltip使用说明
2012/07/14 Javascript
使用jQuery不判断浏览器高度解决iframe自适应高度问题
2014/12/16 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
不得不分享的JavaScript常用方法函数集(上)
2015/12/23 Javascript
Angular.js与Bootstrap相结合实现手风琴菜单代码
2016/04/13 Javascript
JavaScript中localStorage对象存储方式实例分析
2017/01/12 Javascript
Mac系统下Webstorm快捷键整理大全
2017/05/28 Javascript
vue 点击按钮增加一行的方法
2018/09/07 Javascript
微信小程序开发之路由切换页面重定向问题
2018/09/18 Javascript
在layui tab控件中载入外部html页面的方法
2019/09/04 Javascript
使用Python神器对付12306变态验证码
2016/01/05 Python
pandas 将索引值相加的方法
2018/11/15 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
python实现Dijkstra算法的最短路径问题
2019/06/21 Python
pandas DataFrame创建方法的方式
2019/08/02 Python
使用pyqt 实现重复打开多个相同界面
2019/12/13 Python
python 实现将Numpy数组保存为图像
2020/01/09 Python
pytorch 图像中的数据预处理和批标准化实例
2020/01/15 Python
Python socket连接中的粘包、精确传输问题实例分析
2020/03/24 Python
零基础小白多久能学会python
2020/06/22 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
2020/09/01 Python
基于CSS3 animation动画属性实现轮播图效果
2017/09/12 HTML / CSS
互动出版网:专业书籍
2017/03/21 全球购物
生物技术专业研究生自荐信
2013/09/22 职场文书
法院授权委托书格式
2014/09/28 职场文书
2014年体育教师工作总结
2014/12/03 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
父亲婚礼答谢词
2015/01/04 职场文书
2016教师读书思廉心得体会
2016/01/23 职场文书
解决xampp安装后Apache无法启动
2022/03/21 Servers