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中的isXX系列是否继续使用的分析
Apr 16 Javascript
Jquery提交表单 Form.js官方插件介绍
Mar 01 Javascript
jquery实现网站超链接和图片提示效果
Mar 21 Javascript
JQuery实现鼠标移动到图片上显示边框效果
Jan 09 Javascript
JavaScript结合AJAX_stream实现流式显示
Jan 08 Javascript
详解JavaScript ES6中的Generator
Jul 28 Javascript
js实现的简洁网页滑动tab菜单效果代码
Aug 24 Javascript
Bootstrap基本样式学习笔记之标签(5)
Dec 07 Javascript
微信小程序 swiper组件构建轮播图的实例
Sep 20 Javascript
vue使用axios时关于this的指向问题详解
Dec 22 Javascript
微信小程序实现侧边栏分类
Oct 21 Javascript
JavaScript 中的执行上下文和执行栈实例讲解
Feb 25 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适配器模式(Adapter)
2014/11/25 PHP
php生成唯一的订单函数分享
2015/02/02 PHP
PHP正则匹配操作简单示例【preg_match_all应用】
2017/07/10 PHP
PHP使用标准库spl实现的观察者模式示例
2018/08/04 PHP
PHP PDOStatement::closeCursor讲解
2019/01/30 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
2019/12/02 PHP
js 对联广告、漂浮广告封装类(IE,FF,Opera,Safari,Chrome
2009/11/26 Javascript
jQuery插件dataTables添加序号列的方法
2016/07/06 Javascript
AngularJS中的DOM操作用法分析
2016/11/04 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
Angular.Js中ng-include指令的使用与实现
2017/05/07 Javascript
Vue中计算属性computed的示例解读
2017/07/26 Javascript
vue下axios拦截器token刷新机制的实例代码
2020/01/17 Javascript
vue 封装 Adminlte3组件的实现
2020/03/18 Javascript
详细分析React 表单与事件
2020/07/08 Javascript
go语言计算两个时间的时间差方法
2015/03/13 Python
python检测远程服务器tcp端口的方法
2015/03/14 Python
python技能之数据导出excel的实例代码
2017/08/11 Python
python通过paramiko复制远程文件及文件目录到本地
2019/04/30 Python
python操作日志的封装方法(两种方法)
2019/05/23 Python
Python使用import导入本地脚本及导入模块的技巧总结
2019/08/07 Python
ORM Django 终端打印 SQL 语句实现解析
2019/08/09 Python
法国时尚品牌乐都特瑞士站:La Redoute瑞士
2016/09/05 全球购物
Notino法国:购买香水和化妆品
2019/04/15 全球购物
英国医生在线预约:Top Doctors
2019/10/30 全球购物
求职信的要素有哪些呢
2013/12/26 职场文书
三严三实心得体会范文
2014/10/13 职场文书
普通党员群众路线教育实践活动心得体会
2014/11/04 职场文书
会计师事务所实习证明
2014/11/16 职场文书
付款承诺函范文
2015/01/21 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
2016年春节慰问信息
2015/03/25 职场文书
2016年秋季运动会通讯稿
2015/11/25 职场文书
2016年小学六一儿童节活动总结
2016/04/06 职场文书
Java Dubbo框架知识点梳理
2021/06/26 Java/Android
mysql函数之截取字符串的实现
2022/08/14 MySQL