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 29 Javascript
js 弹出框只弹一次(二次修改之后的)
Nov 26 Javascript
sogou地图API用法实例教程
Sep 11 Javascript
js实例属性和原型属性示例详解
Nov 23 Javascript
jQuery简单获取键盘事件的方法
Jan 22 Javascript
es6学习笔记之Async函数的使用示例
May 11 Javascript
浅谈JavaScript面向对象--继承
Mar 20 Javascript
如何在JavaScript中谨慎使用代码注释
Jun 21 Javascript
微信小程序 动态修改页面数据及参数传递过程详解
Sep 27 Javascript
ES2020 新特性(种草)
Jan 12 Javascript
手把手教你实现 Promise的使用方法
Sep 02 Javascript
vue实现登录功能
Dec 31 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
php的字符串用法小结
2010/06/08 PHP
完美实现GIF动画缩略图的php代码
2011/01/02 PHP
smarty巧妙处理iframe中内容页的代码
2012/03/07 PHP
php中使用preg_replace函数匹配图片并加上链接的方法
2013/02/06 PHP
PHP中4个加速、缓存扩展的区别和选用建议
2014/03/12 PHP
php中二维数组排序问题方法详解
2015/08/28 PHP
WordPress中获取所使用的模板的页面ID的简单方法
2015/12/31 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
Laravel 前端资源配置教程
2019/10/18 PHP
如何利用AngularJS打造一款简单Web应用
2015/12/05 Javascript
Vue的Flux框架之Vuex状态管理器
2017/07/30 Javascript
JavaScript 异步调用
2017/10/25 Javascript
Vue中的vue-resource示例详解
2018/11/02 Javascript
js实现搜索栏效果
2018/11/16 Javascript
vue过滤器用法实例分析
2019/03/15 Javascript
[01:25]2015国际邀请赛最佳短片奖——斧王《拆塔英雄:天赋异禀》
2015/09/22 DOTA
wxPython 入门教程
2008/10/07 Python
python共享引用(多个变量引用)示例代码
2013/12/04 Python
gearman的安装启动及python API使用实例
2014/07/08 Python
python实现telnet客户端的方法
2015/04/15 Python
Python实现二叉堆
2016/02/03 Python
Python3几个常见问题的处理方法
2019/02/26 Python
详解python selenium 爬取网易云音乐歌单名
2019/03/28 Python
python gdal安装与简单使用
2019/08/01 Python
python opencv调用笔记本摄像头
2019/08/28 Python
Python字符串、列表、元组、字典、集合的补充实例详解
2019/12/20 Python
python 已知平行四边形三个点,求第四个点的案例
2020/04/12 Python
python自动提取文本中的时间(包含中文日期)
2020/08/31 Python
惠普加拿大在线商店:HP加拿大
2017/09/15 全球购物
Crabtree & Evelyn英国官网:瑰珀翠护手霜、香水、沐浴和身体护理
2018/04/26 全球购物
工程业务员工作职责
2013/12/07 职场文书
工商管理专业职业生涯规划
2014/01/01 职场文书
幼儿园三八妇女节活动方案
2014/03/11 职场文书
2014年数学教师工作总结
2014/12/03 职场文书
收银员岗位职责
2015/02/03 职场文书
React如何创建组件
2021/06/27 Javascript