之前闲来了解了__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属性介绍的更多相关文章

  1. Javascript object.constructor属性与面向对象编程(oop)

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

  2. javascript对象constructor属性

    概述 返回一个指向创建了该对象原型的函数引用.需要注意的是,该属性的值是那个函数本身,而不是一个包含函数名称的字符串.对于原始值(如1,true 或 "test"),该属性为只读. ...

  3. javascript的constructor属性

    /* constructor 属性 constructor 属性返回所有 JavaScript 变量的构造函数. */console.log("John".constructor) ...

  4. Javascript属性constructor/prototype的底层原理

    在Javascript语言中,constructor属性是专门为function而设计的,它存在于每个function的prototype属性中. 这个constructor保存了指向function ...

  5. javascript Prototype constructor的理解(转)

    讲JS的构造的,这个比较清晰,但并不表示一定正确. 这几天一直在思考这个东东,感觉比以前理解更深入了. http://blog.csdn.net/chunqiuwei/article/details/ ...

  6. [javascript基础]constructor与prototype

    最初对js中 object.constructor 的认识: 在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下 ...

  7. JavaScript函数constructor的作用,意义

    前几天写了一片 如何用正确的姿势编写jQuery插件 有朋友拍砖,指正.再此谢谢! 讨论:指定函数的constructor作用到底是什么? 我们一般写jQuery插件的时候是这样的: //构造函数 f ...

  8. javascript中constructor指向问题

    首先用一个例子指出来constructor存在形式. function Fruit(){ } var f=new Fruit(); console.log(f.constructor);//打印出Fr ...

  9. [JavaScript] New-Agnostic Constructor Pattern

    function User (name, password) { var self = this instanceof User ? this : new User(); if (name != nu ...

随机推荐

  1. docker启动遇到的问题

    转:https://blog.csdn.net/w1316022737/article/details/83692701 遇到问题: Job for docker.service failed bec ...

  2. struts-dojo的使用

    1.导入struts2-dojo-plugin-2.1.8.jar 2.在用使用dojo的页面引入 <span style="font-size:14px;">< ...

  3. 每天一点Linux-01文档系统

    Windows: 以多根的方式组织文档 C: D: E:Linux: 以单根的方式组织文档 / /目录结构: FSH (Filesystem Hierarchy Standard) [root@yan ...

  4. OpenCV 基本的阈值操作

    #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #i ...

  5. considerate|considerable|content|Contact|Consult|deceived|

    ADJ-GRADED 替人着想的;体贴的Someone who is considerate pays attention to the needs, wishes, or feelings of o ...

  6. 吴裕雄--天生自然HTML学习笔记:HTML 文本格式化

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. Spring+Struts2+Mybatis整合

    1. 创建项目 2. 添加Spring能力 使用MyEclipse自动加载Struts2和Spring的jar包和配置文件,并在web.xml文件中添加上下文和监听器 web.xml文件如下: < ...

  8. TCP/IP 协议栈初识

    原文:深入浅出 TCP/IP 协议栈 0. 简介 TCP/IP 协议栈是网络通信中一系列网络协议的综合,是核心骨架.它定义了电子设备接入因特网.以及数据在它们之间的传输方式,是一份标准.TCP/IP ...

  9. Mac 环境docker 安装jenkins

    网上很多的教程是讲的是Linux 上的Docker安装Jenkins,但是我用的是Mac,所以参考之前的前辈写的文章,记录一下自己的安装过程.非常感谢参考文章的前辈写的文章. 参考Docker安装Je ...

  10. String.slice

    String.slice(start, end)start从字符串的哪个index开始截取 默认值0 如果为负值,则从字符串的尾部向前倒推indexend到从字符串的哪个index结束截取 默认值st ...