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

【完】

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

最新文章

  1. Mongodb 副本集分片(一)---初始化mongodb安装启动
  2. Postgresql FATAL: could not create semaphores: No space left on device
  3. 演示一个导致ora-01555错误的场景
  4. UVA题目分类
  5. php 利用activeMq+stomp实现消息队列
  6. 【IT历史】SP和CP
  7. c语言"a<b<c"条件值的判定
  8. vsftp被动模式启用iptables访问设置
  9. css布局&初始化&基准样式
  10. jquery扩展方法
  11. html页面不显示中文
  12. Eclipse 快捷方式 指定 固定 workspace
  13. 使用JDBC操作MySQL数据库
  14. Hackers' Crackdown UVA - 11825 (状压dp)
  15. 《DSP using MATLAB》Problem 5.21
  16. 数据库SQL语言学习--上机练习4(视图)
  17. C语言与数据库操作入门
  18. Java-Java语言
  19. 软件工程项目基于java的wc实现
  20. 10个常见的Android 新手误区

热门文章

  1. 金山wps的面试经历
  2. jQuery性能优化与技巧
  3. Centos-Apache服务(2)
  4. 82)PHP,基本框架类步骤
  5. [2015普及组-D]推销员 思维que
  6. mapreduce.shuffle set in yarn.nodemanager.aux-services is invalid
  7. web中间件之nginx
  8. windows下的tfjs-node安装异常总结
  9. npm install依赖时,常见错误
  10. configure: error: C compiler cannot create executables报错处理