浅谈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 图像动画的小demo
May 23 Javascript
JQuery处理json与ajax返回JSON实例代码
Jan 03 Javascript
在Firefox下js select标签点击无法弹出
Mar 06 Javascript
JavaScript把数组作为堆栈使用的方法
Mar 20 Javascript
JS实现环形进度条(从0到100%)效果
Jul 05 Javascript
js创建数组的简单方法
Jul 27 Javascript
Bootstrap源码解读表单(2)
Dec 22 Javascript
Angular之指令Directive用法详解
Mar 01 Javascript
js中bool值的转换及“&&”、“||”、 “!!”详解
Dec 21 Javascript
原生JS实现旋转轮播图+文字内容切换效果【附源码】
Sep 29 Javascript
微信小程序实现搜索历史功能
Mar 26 Javascript
vue中对象数组去重的实现
Feb 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数据库操作类代码(增,删,改,查)
2013/04/08 PHP
CodeIgniter针对数据库的连接、配置及使用方法
2016/03/03 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
2016/06/13 PHP
一个js写的日历(代码部分网摘)
2009/09/20 Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
2010/11/28 Javascript
javascript 学习笔记(六)浏览器类型及版本信息检测代码
2011/04/08 Javascript
简介JavaScript中的setTime()方法的使用
2015/06/11 Javascript
IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题
2015/08/21 Javascript
JavaScript操作class和style样式代码详解
2016/02/13 Javascript
深入浅析Bootstrap列表组组件
2016/05/03 Javascript
js获取鼠标点击的对象,点击另一个按钮删除该对象的实现代码
2016/05/13 Javascript
jquery div模态窗口的简单实例
2016/05/28 Javascript
总结AngularJS开发者最常犯的十个错误
2016/08/31 Javascript
javascript代码调试之console.log 用法图文详解
2016/09/30 Javascript
微信小程序 合法域名校验出错详解及解决办法
2017/03/09 Javascript
canvas实现环形进度条效果
2017/03/23 Javascript
Vue.js鼠标悬浮更换图片功能
2017/05/17 Javascript
mac上node.js环境的安装测试
2017/07/03 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
vue2.0.js的多级联动选择器实现方法
2018/02/09 Javascript
Bootstrap实现模态框效果
2019/09/30 Javascript
微信小程序wxml列表渲染原理解析
2019/11/27 Javascript
ES6实现图片切换特效代码
2020/01/14 Javascript
js实现简单商品筛选功能
2021/02/02 Javascript
django1.8使用表单上传文件的实现方法
2016/11/04 Python
python中reduce()函数的使用方法示例
2017/09/29 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
2019/07/22 Python
python实现while循环打印星星的四种形状
2019/11/23 Python
python json.dumps() json.dump()的区别详解
2020/07/14 Python
SheIn俄罗斯:时尚女装网上商店
2017/02/28 全球购物
小学雷锋月活动总结
2014/07/03 职场文书
四风对照检查材料范文
2014/09/27 职场文书
教师调动申请报告
2015/05/18 职场文书
新手必备之MySQL msi版本下载安装图文详细教程
2021/05/21 MySQL
Spring Data JPA框架自定义Repository接口
2022/04/28 Java/Android