javascript的constructor属性介绍
之前闲来了解了__proto__和prototype的区别,每个对象都有隐私属性__proto__,而prototype是javascript函数特有的属性。那么constructor属性呢?最近是遇到一个bug:IOS8.3系统File对象的原型上面没有constructor属性,所以无法new一个file实例。那么什么时候能用new方法呢?
javascript高级编程中对于Object对象解释:
Object的每个实例都具有constructor属性,constructor(构造函数)保存用于创建当前对象的函数。
其实实例上面的constructor属性是因为继承了构造函数原型上的constructor属性,例如下面例子的Person.prototype.constructor。
constructor是function特有的,是在function的prototype上面的属性,指向function的一个引用。
JS中new操作符(创建对象实例)都做了什么呢?看个例子:
var Person = function(name){
this.name = name;
}
Person.prototype.sayHi = function(){
console.log(`Hi,${this.name}`);
}
var p = new Person('miya');
p.sayHi(); //Hi,miya
var o = Object.create({})
var p = new o()
// Uncaught TypeError: o is not a constructor
new一个实例时候其实发生的操作:
function New(F){
var obj = {'__proto__':F.prototype}; //创建一个类的实例,将实例的__proto__指针指向F.prototype
return function(){
F.apply(obj,arguments);//改变this指向
return obj; //返回实例
}
那么上面的o对象是个没有原型的空对象,不能进行new实例,报错原因是:o不是个构造器,因为o没有原型,所以new时候第一步就报错,因为o.prototype不存在。
如果改写函数的prototype属性,这里的改写是指重新赋值。那么prototype.constructor属性值会改变。
Boolean.prototype.constructor === Boolean //true
Array.prototype.constructor === Array //true
var a = [1,2,3]
a.__proto__.constructor === Array //true
之前说过instanceof是用来判断原型链继承的。
a instanceof Array //true
a本身就是数组,继承Array.prototype肯定是true了。
那么什么时候new一个实例不会报错呢?
1,new操作符只能操作函数,对象是不能操作的,IOS8.3的File对象是个对象,而不是个构造器。
2,该函数必须有原型对象(一般函数都有原型对象的),原型对象被改写也无所谓,必须得有prototype属性。
至于prototype上有没有constructor属性,这个无关紧要,报错说:o is not a constructor,只是告诉你,你必须用构造器来new一个实例。
【完】
“顿悟”,那也是需要前期的功课、积累,还需要静待开悟机缘的到来,最后才能在电光火石之间“顿悟”的。
javascript的constructor属性介绍的更多相关文章
- Javascript object.constructor属性与面向对象编程(oop)
定义和用法 在 JavaScript 中, constructor 属性返回对象的构造函数. 返回值是函数的引用,不是函数名: JavaScript 数组 constructor 属性返回 funct ...
- javascript对象constructor属性
概述 返回一个指向创建了该对象原型的函数引用.需要注意的是,该属性的值是那个函数本身,而不是一个包含函数名称的字符串.对于原始值(如1,true 或 "test"),该属性为只读. ...
- javascript的constructor属性
/* constructor 属性 constructor 属性返回所有 JavaScript 变量的构造函数. */console.log("John".constructor) ...
- Javascript属性constructor/prototype的底层原理
在Javascript语言中,constructor属性是专门为function而设计的,它存在于每个function的prototype属性中. 这个constructor保存了指向function ...
- javascript Prototype constructor的理解(转)
讲JS的构造的,这个比较清晰,但并不表示一定正确. 这几天一直在思考这个东东,感觉比以前理解更深入了. http://blog.csdn.net/chunqiuwei/article/details/ ...
- [javascript基础]constructor与prototype
最初对js中 object.constructor 的认识: 在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下 ...
- JavaScript函数constructor的作用,意义
前几天写了一片 如何用正确的姿势编写jQuery插件 有朋友拍砖,指正.再此谢谢! 讨论:指定函数的constructor作用到底是什么? 我们一般写jQuery插件的时候是这样的: //构造函数 f ...
- javascript中constructor指向问题
首先用一个例子指出来constructor存在形式. function Fruit(){ } var f=new Fruit(); console.log(f.constructor);//打印出Fr ...
- [JavaScript] New-Agnostic Constructor Pattern
function User (name, password) { var self = this instanceof User ? this : new User(); if (name != nu ...
随机推荐
- django框架基础-ORM进阶-长期维护
############### ORM进阶---contenttype ################ 设计思路: """ 路飞有两种课,专题课和学位课, ...
- Session深入浅出
Session会在浏览器关闭后消失吗? 通常情况下,当我们关闭浏览器再重新打开后,我们就需要再次进行登陆(如果没有进行下次自动登录之类的设置).在Jav中(Session是通用的,这里以Java为例) ...
- SQL中的一些关键字用法
1.where 条件筛选结果 select * from `表名` where `列名`='value' 上诉语句的意思是在某表中查询某列名等于某特定值得所有列 2.Like 模糊查询 select ...
- 整合SSM遇到的错误,数据库连接失败问题集合
Could not get JDBC Connection; nested exception is java.sql.SQLException: Connections could not be a ...
- SpringMVC学习笔记八:文件上传及多个文件上传
SpringMVC实现文件上传需要加入jar包,commons-fileupload-1.3.1.jar,commons-io-2.2.jar 项目目录树: pom.xml加入需要的包 <pro ...
- SSM框架三分钟搞定分页查询
使用的国产第三方jar pagehelper 里面的基本属性值 //当前页 private int pageNum; //每页的数量 private int pageSize; //当前页的数量 ...
- 添砖加瓦:简述ELK部署
1.准备工作 ELK下载:https://www.elastic.co/downloads/ jdk version:1.8.0_162 2.环境搭建 ElasticSearch: (1)不能使用ro ...
- 2019DDCTF部分Writeup
-- re Windows Reverse1 通过DIE查壳发现存在upx,在linux上upx -d脱壳即可,拖入IDA,通过关键字符串找到关键函数: main函数中也没有什么,将输入的字符串带到s ...
- es6this箭头函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 < ...
- Hexo搭建个人博客(一)— 前期准备
最近几个月自学python的过程中,搜索爬虫资料的时候关注了xlzd的博客,为我开启了一片新世界,之后慢慢收藏了各方高人的博客.搭建一个自己博客的萌芽也悄然种下,也许是命运使然,在逛知乎的时候偶然间看 ...