浅谈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 指导方针
Apr 05 Javascript
Prototype 学习 工具函数学习($方法)
Jul 12 Javascript
javascript中验证大写字母、数字和中文
Jan 15 Javascript
jquery 实现两级导航菜单附效果图
Mar 07 Javascript
jQuery中的height innerHeight outerHeight区别示例介绍
Jun 15 Javascript
jQuery表单设置值的方法
Jun 30 jQuery
浅谈箭头函数写法在ReactJs中的使用
Aug 22 Javascript
浅谈Angular4实现热加载开发旅程
Sep 08 Javascript
ES6 fetch函数与后台交互实现
Nov 14 Javascript
小程序实现左右来回滚动字幕效果
Dec 28 Javascript
详细讲解如何创建, 发布自己的 Vue UI 组件库
May 29 Javascript
微信小程序开发之转发分享功能
Oct 22 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
正则表达式语法
2006/10/09 Javascript
PHP面向对象学习笔记之二 生成对象的设计模式
2012/10/06 PHP
PHP5.4中json_encode中文转码的变化小结
2013/01/30 PHP
PHP+MySQL修改记录的方法
2015/01/21 PHP
SESSION存放在数据库用法实例
2015/08/08 PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
2019/04/10 PHP
jquery 插件之仿“卓越亚马逊”首页弹出菜单效果
2008/12/25 Javascript
对采用动态原型方式无法展示继承机制得思考
2009/12/04 Javascript
JavaScript 高级篇之函数 (四)
2012/04/07 Javascript
解析jquery获取父窗口的元素
2013/06/26 Javascript
JS动态修改iframe内嵌网页地址的方法
2015/04/01 Javascript
JQuery判断radio(单选框)是否选中和获取选中值方法总结
2015/04/15 Javascript
快速学习jQuery插件 jquery.validate.js表单验证插件使用方法
2015/12/01 Javascript
jquery获取img的src值的简单实例
2016/05/17 Javascript
Vue 过渡实现轮播图效果
2017/03/27 Javascript
从零开始搭建vue移动端项目到上线的步骤
2018/10/15 Javascript
vue获取时间戳转换为日期格式代码实例
2019/04/17 Javascript
Android 自定义view仿微信相机单击拍照长按录视频按钮
2019/07/19 Javascript
js实现小时钟效果
2020/03/25 Javascript
为react组件库添加typescript类型提示的方法
2020/06/15 Javascript
在vue中使用Base64转码的案例
2020/08/07 Javascript
Python with用法实例
2015/04/14 Python
django实现类似触发器的功能
2019/11/15 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
2020/01/18 Python
Python实现代码块儿折叠
2020/04/15 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
python中pickle模块浅析
2020/12/29 Python
英国家喻户晓的家居商店:The Range
2019/03/25 全球购物
星空联盟C# .net笔试题
2014/12/05 面试题
大学生毕业的自我评价分享
2014/01/02 职场文书
请假条怎么写
2014/04/10 职场文书
药剂专业自荐信范文
2014/04/16 职场文书
2015年乡镇环保工作总结
2015/04/22 职场文书
2015年导购员工作总结
2015/04/25 职场文书
草房子读书笔记
2015/06/29 职场文书
分析Java中Map的遍历性能问题
2021/06/26 Java/Android