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 相关文章推荐
js变量作用域及可访问性的探讨
Nov 23 Javascript
jquery制作漂亮的弹出层提示消息特效
Dec 23 Javascript
jQuery实现的支持IE的html滑动条
Mar 16 Javascript
简易的投票系统以及js刷票思路和方法
Apr 07 Javascript
JS+CSS实现的经典tab选项卡效果代码
Sep 16 Javascript
js纯数字逐一停止显示效果的实现代码
Mar 16 Javascript
jQuery Mobile 和 Kendo UI 的比较
May 05 Javascript
JavaScipt选取文档元素的方法(推荐)
Aug 05 Javascript
input输入密码变黑点密文的实现方法
Jan 09 Javascript
vue.js获取数据库数据实例代码
May 26 Javascript
jQuery实现html双向绑定功能示例
Oct 09 jQuery
vue打开其他项目页面并传入数据详解
Nov 25 Vue.js
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
mysql建立外键
2006/11/25 PHP
php中支持多种编码的中文字符串截取函数!
2007/03/20 PHP
PHP 5.3新特性命名空间规则解析及高级功能
2010/03/11 PHP
php日历制作代码分享
2014/01/20 PHP
PHP-FPM运行状态的实时查看及监控详解
2016/11/18 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
2018/12/20 PHP
JavaScript OOP面向对象介绍
2010/12/02 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
2011/09/21 Javascript
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
2012/05/23 Javascript
JavaScript控制网页平滑滚动到指定元素位置的方法
2015/04/17 Javascript
Node.js+Express配置入门教程
2016/05/19 Javascript
功能强大的Bootstrap使用手册(一)
2016/08/02 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
jquery.zclip轻量级复制失效问题
2017/01/08 Javascript
Vuex模块化实现待办事项的状态管理
2017/03/15 Javascript
利用require.js与angular搭建spa应用的方法实例
2017/07/19 Javascript
javascript计算渐变颜色的实例
2017/09/22 Javascript
AngularJs 最新验证手机号码的实例,成功测试通过
2017/11/26 Javascript
Node.js + express实现上传大文件的方法分析【图片、文本文件】
2019/03/14 Javascript
vue 实现小程序或商品秒杀倒计时
2019/04/14 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
2020/03/02 Javascript
ES6 Generator基本使用方法示例
2020/06/06 Javascript
django自定义Field实现一个字段存储以逗号分隔的字符串
2014/04/27 Python
python计算时间差的方法
2015/05/20 Python
Linux下通过python获取本机ip方法示例
2019/09/06 Python
Python如何使用BeautifulSoup爬取网页信息
2019/11/26 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
Python Charles抓包配置实现流程图解
2020/09/29 Python
纯HTML5+CSS3制作图片旋转
2016/01/12 HTML / CSS
英国打印机墨水和碳粉商店:Printerinks
2017/06/30 全球购物
西海岸男士和男童服装:Johnnie-O
2018/03/15 全球购物
init进程的作用
2015/08/20 面试题
英语读书笔记
2015/07/02 职场文书
社区服务理念口号
2015/12/25 职场文书
改进工作作风心得体会
2016/01/23 职场文书
PostgreSQL基于pgrouting的路径规划处理方法
2022/04/18 PostgreSQL