• 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一个实例。

    【完】

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

  • 相关阅读:
    ubuntu安装docker-compose
    docker-compose常用命令(持续更新...)
    docker运行jpress
    gcc -o选项:指定输出文件
    gcc -c:只编译不链接,仅生成目标文件
    WMWare下安装centOS7,并使用xshell进行连接记录.
    主线程和子线程多种情况小探讨
    Sleep的本质
    为什么要对多线程进行加锁操作呢
    list操作相关总结
  • 原文地址:https://www.cnblogs.com/tangjiao/p/10036485.html
Copyright © 2020-2023  润新知