JavaScript中的prototype和constructor简明总结


Posted in Javascript onApril 05, 2014

一、constructor
constructor的值是一个函数。在JavaScript中,除了null和undefined外的类型的值、数组、函数以及对象,都有一个constructor属性,constructor属性的值是这个值、数组、函数或者对象的构造函数。如:

var a = 12, // 数字
    b = 'str', // 字符串
    c = false, // 布尔值
    d = [1, 'd', function() { return 5; }], // 数组
    e = { name: 'e' }, // 对象
    f = function() { return 'function'; }; // 函数console.log('a: ', a.constructor); // Number()
console.log('b: ', b.constructor); // String()
console.log('c: ', c.constructor); // Boolean()
console.log('d: ', d.constructor); // Array()
console.log('e: ', e.constructor); // Object()
console.log('f: ', f.constructor); // Function()

以上的构造函数都是JavaScript内置的,我们也可以自定义构造函数,如:

function A(name) {
    this.name = name;
}var a = new A('a');
console.log(a.constructor); // A(name)

调用构造函数时,需要用new关键字,构造函数返回的是一个对象,看下面的代码就知道了:

var a = 4;
var b = new Number(4);console.log('a: ', typeof a); // a: number
console.log('b: ', typeof b); // b: object

二、 prototype
prototype是函数的一个属性,默认情况下,一个函数的prototype属性的值是一个与函数同名的空对象,匿名函数的prototype属性名为Object。如:

function fn() {}console.log(fn.prototype); // fn { }

prototype属性主要用来实现JavaScript中的继承,如:

function A(name) {
    this.name = name;
}A.prototype.show = function() {
    console.log(this.name);
};
function B(name) {
    this.name = name;
}
B.prototype = A.prototype;
var test = new B('test');
test.show(); // test

这儿有一个问题,test的构造函数其实是A函数而不是B函数:

console.log(test.constructor); // A(name)

这是因为B.prototype = A.prototype把B.prototype的构造函数改成了A,所以需要还原B.prototype的构造函数:

function A(name) {
    this.name = name;
}A.prototype.show = function() {
    console.log(this.name);
};
function B(name) {
    this.name = name;
}
B.prototype = A.prototype;
B.prototype.constructor = B;
var test = new B('test');
test.show(); // test
console.log(test.constructor); // B(name)

之所以要这么做,是因为prototype的值是一个对象,且它的构造函数也就是它的constructor属性的值就是它所在的函数,即:

console.log(A.prototype.constructor === A); // true

Javascript 相关文章推荐
用javascript实现改变TEXTAREA滚动条和按钮的颜色,以及怎样让滚动条变得扁平
Apr 20 Javascript
基于jQuery的获取标签名的代码
Jul 16 Javascript
浅谈jQuery的offset()方法及示例分享
Jul 17 Javascript
真正好用的js验证上传文件大小的简单方法
Oct 27 Javascript
jquery Easyui Datagrid实现批量操作(编辑,删除,添加)
Feb 20 Javascript
JS基于正则表达式的替换操作(replace)用法示例
Apr 28 Javascript
JS移动端/H5同时选择多张图片上传并使用canvas压缩图片
Jun 20 Javascript
jQuery UI 实例讲解 - 日期选择器(Datepicker)
Sep 18 jQuery
jquery实现倒计时小应用
Sep 19 jQuery
pace.js和NProgress.js两个加载进度插件的一点小总结
Jan 31 Javascript
vue项目关闭eslint校验
Mar 21 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
Oct 30 Javascript
JavaScript中的typeof操作符用法实例
Apr 05 #Javascript
Javascript排序算法之计数排序的实例
Apr 05 #Javascript
JavaScript中的正则表达式简明总结
Apr 04 #Javascript
JavaScript格式化日期时间的方法和自定义格式化函数示例
Apr 04 #Javascript
Javascript排序算法之合并排序(归并排序)的2个例子
Apr 04 #Javascript
JQuery记住用户名和密码的具体实现
Apr 04 #Javascript
JS根据变量保存方法名并执行方法示例
Apr 04 #Javascript
You might like
php设计模式 State (状态模式)
2011/06/26 PHP
php字符串替换函数substr_replace()用法实例
2015/03/17 PHP
PHP中Static(静态)关键字功能与用法实例分析
2019/04/05 PHP
javascript英文日期(有时间)选择器
2007/05/02 Javascript
JS中showModalDialog 的使用解析
2013/04/17 Javascript
JS获取节点的兄弟,父级,子级元素的方法
2014/01/09 Javascript
js中的getAttribute方法使用示例
2014/08/01 Javascript
jQuery实现的导航下拉菜单效果
2016/07/04 Javascript
学习vue.js计算属性
2016/12/03 Javascript
微信小程序 页面跳转及数据传递详解
2017/03/14 Javascript
浅谈JavaScript find 方法不支持IE的问题
2017/09/28 Javascript
基于JavaScript实现五子棋游戏
2020/08/26 Javascript
jQuery实现当拉动滚动条到底部加载数据的方法分析
2019/01/24 jQuery
js中Generator函数的深入讲解
2019/04/07 Javascript
vue商城中商品“筛选器”功能的实现代码
2020/07/01 Javascript
Python入门篇之编程习惯与特点
2014/10/17 Python
Python 基于Twisted框架的文件夹网络传输源码
2016/08/28 Python
Pycharm学习教程(2) 代码风格
2017/05/02 Python
在Python中实现替换字符串中的子串的示例
2018/10/31 Python
python匹配两个短语之间的字符实例
2018/12/25 Python
python实现邮件发送功能
2019/08/10 Python
python使用opencv在Windows下调用摄像头实现解析
2019/11/26 Python
Python Django路径配置实现过程解析
2020/11/05 Python
澳洲在线厨具商店:Kitchen Style
2018/05/05 全球购物
杭州-DOTNET笔试题集
2013/09/25 面试题
职业女性的职业规划
2014/03/04 职场文书
校庆接待方案
2014/03/18 职场文书
3的组成教学反思
2014/04/30 职场文书
公司联欢会策划方案
2014/05/19 职场文书
殡葬服务心得体会
2014/09/11 职场文书
2015年话务员工作总结
2015/04/29 职场文书
大学生逃课检讨书
2015/05/04 职场文书
党支部半年考察意见
2015/06/01 职场文书
药房管理制度范本
2015/08/06 职场文书
2019年个人工作总结范文(3篇)
2019/08/27 职场文书
docker compose 部署 golang 的 Athens 私有代理问题
2022/04/28 Servers