• 初学JavaScript之推測new操作符的原理


    本文是一篇原理推測的文章,假设有不准确的地方请指正,

    原文:http://blog.csdn.net/softmanfly/article/details/34833931

    JavaScript中构造函数与普通函数事实上没有什么区别,构造函数能够当做普通函数来使用,普通函数也能够用new来模拟构造函数的调用。然而使普通函数与构造函数发生区别的事实上就在于new操作符的内部原理。以下是我通过測试推測的new操作符的运行过程,当你在用new操作符来生成一个对象时内部可能运行了以下几个步骤的操作:

    以构造函数 

    function Person(name){

    this.name = name

    this.sayName = function() {

    alert(this.name);

    }

    }

    来举例说明:

    (1) 新建一个对象 var object = {};

    (2) 然后设置构造函数的作用域为object,这样就能使用this指针,详细的操作可能是这种:

    Person.apply(object。name);

    (3) 运行构造函数中的详细代码,因为上一步apply使用的作用域是object,所以当运行this.name = name时事实上运行器先是去寻找object中有没有name属性。没有name属性就加入一个name属性,并为他赋值。

    (4) 返回这个创建的object;


    var p = new Person("cat");

    window.sayName = p.sayName;

    window.sayName();

    终于事实上输出的是undefined为什么呢?

    由于 假设未对函数进行this指针重定向操作的话(三种方式:object.sayName, sayName.apply(object), var object = new Person()),那么这个函数在调用时所创建的运行上下文环境中的this指针默认指向的是window全局对象,所以当调用window.sayName时。要alert一个this.name,事实上就是在alert window.name,而window对象中没有name这个属性,所以就提示undefined。

    假设你调用window.sayName = p.sayName.bind(p);然后再去调用window.sayName的话。输出就变成了cat,这是由于你把一个新的sayName对象(由于bind返回的是一个新的对象)的this指针绑定到了p对象上,即this指向p对象。当你再调用window.sayName()时搜索sayName函数对象的this指针就不再是window对象了,而是p。此时就直接输出了cat.

  • 相关阅读:
    形态学权重图像去噪
    druid配置
    @mapper个人理解
    mybatis自动生成的bean接口在service层找不到
    type-aliases-package的作用
    windows查询端口是否被占用
    idea中使用lombok注解无效
    springboot+dubbo问题记录
    springboot跳转到其他controller
    BigDecimal做减法计算
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7093416.html
Copyright © 2020-2023  润新知