浅谈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得到网页中所有的div的id
Oct 19 Javascript
在js中使用"with"语句中跨frame的变量引用问题
Mar 08 Javascript
javascript模块化是什么及其优缺点介绍
Sep 02 Javascript
JS 页面计时器示例代码
Oct 28 Javascript
js 与 php 通过json数据进行通讯示例
Mar 26 Javascript
javascript匿名函数实例分析
Nov 18 Javascript
javascript实现图片循环渐显播放的方法
Feb 24 Javascript
js实现StringBuffer的简单实例
Sep 02 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
Jan 19 Javascript
使用contextMenu插件实现Bootstrap table弹出右键菜单
Feb 20 Javascript
Vue3.0结合bootstrap创建多页面应用
May 28 Javascript
jQuery 选择方法及$(this)用法实例分析
May 19 jQuery
全面了解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
shopex主机报错误请求解决方案(No such file or directory)
2011/12/27 PHP
mysql,mysqli,PDO的各自不同介绍
2012/09/19 PHP
PHP 使用redis简单示例分享
2015/03/05 PHP
JavaScript:Div层拖动效果实例代码
2013/08/06 Javascript
javaScript arguments 对象使用介绍
2013/10/18 Javascript
两个数组去重的JS代码
2013/12/04 Javascript
js中传递特殊字符(+,&)的方法
2014/01/16 Javascript
JavaScript中的console.profile()函数详细介绍
2014/12/29 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
js字符串截取函数slice、substring和substr的比较
2016/05/17 Javascript
Ext JS框架程序中阻止键盘触发回退或者刷新页面的代码分享
2016/06/07 Javascript
jquery select2的使用心得(推荐)
2016/12/04 Javascript
基于layer.js实现收货地址弹框选择然后返回相应的地址信息
2017/05/26 Javascript
浅谈angular.copy() 深拷贝
2017/09/14 Javascript
Babel 入门教程学习笔记
2018/06/13 Javascript
vue cli 3.x 项目部署到 github pages的方法
2019/04/17 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
2019/09/29 Javascript
Vue组件模板的几种书写形式(3种)
2020/02/19 Javascript
vue 出现data-v-xxx的原因及解决
2020/08/04 Javascript
uni-app 自定义底部导航栏的实现
2020/12/11 Javascript
全面解析js中的原型,原型对象,原型链
2021/01/25 Javascript
[01:06]DOTA2小知识课堂 Ep.01 TP出门不要忘记帮队友灌瓶哦
2019/12/05 DOTA
python创建一个最简单http webserver服务器的方法
2015/05/08 Python
Python获取某一天是星期几的方法示例
2017/01/17 Python
基于django2.2连oracle11g解决版本冲突的问题
2020/07/02 Python
CSS3 transform的skew属性值图文详解
2014/07/21 HTML / CSS
英国独特礼物想法和个性化礼物网站:notonthehighstreet.com
2018/04/16 全球购物
旅游管理本科生求职信
2013/10/14 职场文书
元宵晚会主持词
2014/03/25 职场文书
战略合作协议书范本
2014/04/18 职场文书
艺术学院毕业生自荐信
2014/07/05 职场文书
应届本科毕业生求职信
2014/07/23 职场文书
扶贫办主任查摆“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
商务司机岗位职责
2015/04/10 职场文书
元旦晚会主持词开场白
2015/05/28 职场文书
Python OpenCV实现传统图片格式与base64转换
2021/06/13 Python