zoukankan      html  css  js  c++  java
  • js中new一个对象的过程

    使用new关键字调用函数(new ClassA())的具体步骤:

    1. 创建空对象;
      var obj = {};

    2. 设置新对象的constructor属性为构造函数的名称,设置新对象的__proto__属性指向构造函数的prototype对象;
      obj.__proto__ = ClassA.prototype;

    3. 使用新对象调用函数,函数中的this被指向新实例对象:
      ClassA.call(obj);  //{}.构造函数();          

    4. 将初始化完毕的新对象地址,保存到等号左边的变量中

    注意:若构造函数中返回this或返回值是基本类型(number、string、boolean、null、undefined)的值,则返回新实例对象;若返回值是引用类型的值,则实际返回值为这个引用类型。

    var foo = "bar";
    function test () {
      this.foo = "foo";
    }
    new test();                    //test中的this指新对象,并未改变全局的foo属性
    console.log(this.foo);             // "bar"
    console.log(new test().foo);  // "foo";

     优先级问题:

    优先级由高到低:小括号(xxx) ---> 属性访问.  ---> new foo() ----> foo()

    function getName(){
        console.log(1)
    }
    function Foo() {
        this.getName = function () {
            console.log(2); 
        };
        return this;
    }
    Foo.getName = function () {
        console.log(3);
    };
    //先从.属性访问符号开始往前面找一个最近的对象,同时注意new Foo()优先于Foo();
    var a=new Foo.getName();//3;===new (Foo.getName)();返回Foo.getName类型的实例 var b=new Foo().getName();//2;===(new Foo()).getName();返回undefined var c=new new Foo().getName();//2;===new (new Foo().getName)();返回Foo.getName类型的实例 new Date().getTime();//===((new Date()).getTime)() (new Date).getTime(); new Date.getTime();//Uncaught TypeError: Date(...).getTime is not a function;===new (Date.getTime)()
    以上皆为个人理解,如有错误之处,欢迎留言指正。
  • 相关阅读:
    Spring Boot中的JSON技术
    Spring Boot中编写单元测试
    如何保证事务方法的幂等
    定时重试线程池
    多线程导致事务失效-记一次性能优化
    自己实现一个简单的数据库事务
    服务器错误码国际化
    spring自定义自动配置注解
    springboot中如何启动tomcat
    用grep来查询日志
  • 原文地址:https://www.cnblogs.com/kevin2chen/p/6418327.html
Copyright © 2011-2022 走看看