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
Sep 24 Javascript
鼠标事件延时切换插件
Mar 12 Javascript
html中的input标签的checked属性jquery判断代码
Sep 19 Javascript
JavaScript中获取高度和宽度函数总结
Oct 08 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
Feb 27 Javascript
AngularJS表格添加序号的方法
Mar 03 Javascript
在bootstrap中实现轮播图实例代码
Jun 11 Javascript
JavaScript实现的斑马线表格效果【隔行变色】
Sep 18 Javascript
对vux点击事件的优化详解
Aug 28 Javascript
vue随机验证码组件的封装实现
Feb 19 Javascript
基于node+websocket+html实现腾讯课堂聊天室聊天功能
Mar 04 Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
Sep 04 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
从一个不错的留言本弄的mysql数据库操作类
2007/09/02 PHP
PHP的可变变量名的使用方法分享
2012/02/05 PHP
探讨捕获php错误信息方法的详解
2013/06/09 PHP
用 Composer构建自己的 PHP 框架之基础准备
2014/10/30 PHP
php实现向javascript传递数组的方法
2015/07/27 PHP
php正则提取html图片(img)src地址与任意属性的方法
2017/02/08 PHP
PHP获取文本框、密码域、按钮的值实例代码
2017/04/19 PHP
firefox事件处理之自动查找event的函数(用于onclick=foo())
2010/08/05 Javascript
在JavaScript中监听IME键盘输入事件
2011/05/29 Javascript
jquery属性选择器not has怎么写 行悬停高亮显示
2013/11/13 Javascript
js简单倒计时实现代码
2016/04/30 Javascript
使用 bootstrap modal遇到的问题小结
2016/11/09 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
2017/02/27 Javascript
ReactNative实现Toast的示例
2017/12/31 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
2018/12/24 Javascript
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
微信小程序使用websocket通讯的demo,含前后端代码,亲测可用
2019/05/22 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
2019/08/14 Javascript
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解
2017/10/20 Python
Python进阶之自定义对象实现切片功能
2019/01/07 Python
Python读取指定日期邮件的实例
2019/02/01 Python
python实现计数排序与桶排序实例代码
2019/03/28 Python
Scrapy-Redis结合POST请求获取数据的方法示例
2019/05/07 Python
PyCharm2018 安装及破解方法实现步骤
2019/09/09 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
文秘专业应届生求职信范文
2013/11/14 职场文书
实习心得体会
2014/01/02 职场文书
《只有一个地球》教学反思
2014/02/14 职场文书
企业节能减排实施方案
2014/03/19 职场文书
超市创业计划书
2014/04/24 职场文书
音乐教师求职信
2014/06/28 职场文书
2014年银行柜员工作总结
2014/11/12 职场文书
2016年父亲节寄语
2015/12/04 职场文书
《七律·长征》教学反思
2016/02/16 职场文书