浅谈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实现div的拖动并调整大小类似qq空间个性编辑模块
Dec 12 Javascript
jQuery中多个元素的Hover事件解决方案
Jun 12 Javascript
jQuery的position()方法详解
Jul 19 Javascript
基于MVC+EasyUI的web开发框架之使用云打印控件C-Lodop打印页面或套打报关运单信息
Aug 29 Javascript
浅谈vue.js中v-for循环渲染
Jul 26 Javascript
详解使用 Node.js 开发简单的脚手架工具
Jun 08 Javascript
微信小程序常见页面跳转操作简单示例
May 01 Javascript
Layui Form 自定义验证的实例代码
Sep 14 Javascript
vuex actions异步修改状态的实例详解
Nov 06 Javascript
node 版本切换的实现
Feb 02 Javascript
JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】
Feb 24 Javascript
深入浅析React中diff算法
May 19 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 curl基本操作详解
2013/07/23 PHP
ThinkPHP3.1新特性之内容解析输出详解
2014/06/19 PHP
Mozilla 表达式 __noSuchMethod__
2009/04/05 Javascript
菜鸟学习JavaScript小实验之函数引用
2010/11/17 Javascript
原生javascript获取元素样式属性值的方法
2010/12/25 Javascript
JavaScript中的prototype和constructor简明总结
2014/04/05 Javascript
nodejs创建web服务器之hello world程序
2015/08/20 NodeJs
Vue.js快速入门教程
2016/09/07 Javascript
JS常见算法详解
2017/02/28 Javascript
图解Javascript——作用域、作用域链、闭包
2017/03/21 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
Vue之Watcher源码解析(1)
2017/07/19 Javascript
nodejs连接mysql数据库及基本知识点详解
2018/03/20 NodeJs
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
2018/08/31 Javascript
使用webpack搭建vue项目实现脚手架功能
2019/03/15 Javascript
微信小程序前端promise封装代码实例
2019/08/24 Javascript
vue输入节流,避免实时请求接口的实例代码
2019/10/30 Javascript
跟老齐学Python之用Python计算
2014/09/12 Python
python判断windows系统是32位还是64位的方法
2015/05/11 Python
Python ValueError: invalid literal for int() with base 10 实用解决方法
2015/06/21 Python
Python线性回归实战分析
2018/02/01 Python
城市观光通行证:The Sightseeing Pass
2018/04/28 全球购物
巴西化妆品商店:Lojas Rede
2019/07/26 全球购物
设计模式的基本要素是什么
2014/04/21 面试题
职业教育毕业生求职信
2013/11/09 职场文书
传媒专业推荐信范文
2013/11/23 职场文书
药学专业学生的自我评价分享
2014/02/06 职场文书
高中学校对照检查材料
2014/08/31 职场文书
小学红领巾广播稿(3篇)
2014/09/13 职场文书
领导班子作风建设剖析材料
2014/10/11 职场文书
维稳承诺书
2015/01/20 职场文书
2015年医院保卫科工作总结
2015/07/23 职场文书
禁毒主题班会教案
2015/08/14 职场文书
读《解忧杂货店》有感:请相信一切都是最好的安排
2019/11/07 职场文书
golang生成vcf通讯录格式文件详情
2022/03/25 Golang
JS开发前端团队展示控制器来为成员引流
2022/08/14 Javascript