之前闲来了解了__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.prototypereturn 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一个实例。

【完】

“顿悟”,那也是需要前期的功课、积累,还需要静待开悟机缘的到来,最后才能在电光火石之间“顿悟”的。

转载于:https://www.cnblogs.com/tangjiao/p/10036485.html

javascript的constructor属性介绍相关推荐

  1. javascript设计模式-Constructor(构造器)模式

    Constructor是一种在内存已分配给该对象的情况下,用于初始化新创建对象的特殊方法.Object构造器用于创建特定类型的对象–准备好对象以备使用,同事接收构造器可以使用参数,以在第一次创建对象时 ...

  2. javascript class constructor

    创建和初始化实例 语法: constructor([arguments]) { ... } 描述: 一个类只能有一个constructor方法 使用super关键字调用父类方法 如果没有显式指定构造方 ...

  3. JavaScript:constructor属性

    constructor属性始终指向创建当前对象的构造函数.比如下面例子: // 等价于 var foo = new Array(1, 56, 34, 12); var arr = [1, 56, 34 ...

  4. JavaScript prototype constructor __proto__

  5. 了解使用JavaScript进行面向对象编程的基础(并增强您的编码…

    by Kris Baillargeon 通过克里斯·拜伦 学习使用JavaScript进行面向对象编程的基础知识(并增强您的编码能力!) (Learn the basics of object-ori ...

  6. jQuery-源码阅读,JavaScript原生继承方式与jQuery中的继承

    JavaScript中继承方法有以下几种: 1.原型链继承: function Book (name,author){this.name=name;this.author=author;}Book.p ...

  7. JavaScript 学习总结(全)

    JavaScript 总结 JavaScript是互联网上最流行的脚本语言,这门语言可用于 HTML和 web,更可广泛用于服务器.PC.笔记本电脑.平板电脑和智能手机等设备,JavaScript是一 ...

  8. JS高级进阶总结day01---面向对象编程介绍,new的工作原理以及构造函数,原型对象,实力函数三者之间的关系

    02-面向对象编程 1.1-面向对象编程介绍 本小节知识点 1.理解什么是面向对象编程 面向对象不是一门技术,而是一种解决问题的思维方式 面向对象的本质是对面向过程的一种封装 2.理解什么是对象 对象 ...

  9. constrctor,prototype,__proto__

    constructor 定义和用法 在 JavaScript 中, constructor 属性返回对象的构造函数. 返回值是函数的引用,不是函数名: true.constructor //funct ...

  10. 撰写本文的所有基本React.js概念

    Update: This article is now part of my book "React.js Beyond The Basics". 更新:本文现在是我的书<超 ...

最新文章

  1. SQL Server 2012 开发新功能 序列对象(Sequence)
  2. OpenCV函数 Laplacian 算子实现
  3. PowerMock 简介--转载
  4. 异常通知(After Throwing Advice)
  5. dba的前景_运维、测试、程序员,这些技术岗位哪个更有前景?
  6. C语言注释与C++注释的相互转换
  7. kubeadm一键搭建kubernetes1.14.1高可用集群
  8. c++ 静态类成员函数(static member function) vs 名字空间 (namespace)
  9. 为什么说劝人报名IT培训班的人,不是坏就是蠢?
  10. 联众打码平台接口调用(初版)
  11. 酒店后台管理系统、客栈管理、入住会员、房间管理、房源、房型、订单、报表、酒店企业、短信模板、积分、打印、交接班、住宿、入住、锁房、收支流水、房间销售、消费项目、酒店管理、渠道销售、支付管理、连锁酒店
  12. 2017-2018-2 20155225《网络对抗技术》实验四 恶意代码分析
  13. Pycharm问题:this applicatation failed to start because it could not find or laod the qt plaform plugin
  14. SHON WEBB:真正的自律,就是将这两件事做到极致
  15. 迁移操作系统:如何把系统迁移到固态硬盘SSD?
  16. 从政府项目中总结出的B端产品账号权限管理
  17. Flutter 1.17重磅发布​!闲鱼最新升级版 Flutter 技术电子书开放下载!
  18. 像经济学家那样思考:信息、激励与政策
  19. Java开发在线支付平台视频教程(AVI格式)
  20. 从谷歌流感趋势谈大数据分析的光荣与陷阱

热门文章

  1. Pop3_解决PKIX:unable to find valid certification path to requested target 的问题
  2. sql之stuff函数学习笔记
  3. java通过jdbc访问数据库
  4. 一根网线连接两台路由器
  5. Eclipse或MyEclipse—在Eclipse或MyEclipse中的操作(1)
  6. (已解决)Mon Apr 08 14:02:29 CST 2019 WARN: Establishing SSL connection without server's
  7. Oracle内账号密码过期the password has expired
  8. Python(含PyCharm及配置)下载安装以及简单使用(Idea)
  9. 最好的5个C++ 网站
  10. pandas提取某两列的值_Pandas进阶修炼120题第五期