精华内容
下载资源
问答
  • js构造函数执行顺序
    2021-03-04 21:19:21
    构造函数的执行流程
    1. 立刻创建一个新的对象。
    2. 将新建的对象设置为函数的this,在构造函数中可以使用this来引用新建的对象。
    3. 逐行执行函数中的代码。
    4. 将新建的对象作为返回值返回。
    function Person(name, age) {
        this.name = name;
        this.age = age;
        this.sayName = function () {
            console.log(this.name);
        }
    }
    
    var per = new Person("jack", 18);
    var per2 = new Person("tom", 20);
    var per3 = new Person("maly", 16);
    
    
    // Person{name: "jack", age: 18, sayName: ƒ}
    console.log(per);
    
    // Person{name: "tom", age: 20, sayName: ƒ}
    console.log(per2);
    
    // Person{name: "maly", age: 16, sayName: ƒ}
    console.log(per3);
    
    更多相关内容
  • 什么是构造函数 通过new操作符调用的函数为构造函数,会构造出一个类的实例 一个函数函数直接调用则为普通函数调用方式,用new调用则为构造函数调用方式 function Fn(name,age){ let n = 5; this.name=name; this...

    什么是构造函数

    通过new操作符调用的函数为构造函数,会构造出一个类的实例
    一个函数直接调用则为普通函数调用方式,用new调用则为构造函数调用方式

    function Fn(name,age){
    	let n = 5;
    	this.name=name;
    	this.age=age;
    }
    Fn("a",10);    //-->普通调用函数方式
    let b = new Fn("b",18); // -->构造函数调用方式
    

    普通函数的执行过程

    1. 形成私有作用域(栈内存)
    2. 形参赋值
    3. 变量提升
    4. 代码执行
    5. 栈内存释放(或不释放)

    构造函数的执行过程

    1. 形成私有作用域

    2. 形参赋值

    3. 变量提升

    前三个步骤的执行过程

    ★ 4、在代码自上而下执行前,在当前的栈内存中创建一个对象(堆内存),暂时不储存任何内容,并让函数中的this指向这个新创建的对象

    第四步执行

    5、自上而下执行代码

    第五步

    ★ 6、返回这个创建的对象(浏览器默认返回)

    第六步私有栈中创建的对象,其实就是这个Fn这个类的实例,this指向这个实例,其中this.xxx都是给这个实例设置的私有变量,最后浏览器会将这个实例返回。

    new Fn(“xxx",xx)时会再创建一个实例,两个实例间相互独立互不影响。


    构造函数的返回值问题

    如果返回值为按值传递类型,则返回值依然为之前创建的实例;
    如果返回值为按引用传递类型,则返回值为你设置的返回值

    function fn (){
    	this.m = 5;
    	return 12
    }
    console.log(new fn())   //--->fn {m: 2}
    
    function fn (){
    	this.m = 5;
    	return {
    		num:12,
    		name:"xxx"
    		}
    }
    console.log(new fn()) //--->{num: 12, name: "xxx"}
    
    展开全文
  • 在第26行始终报错,于是开始注意到构造函数执行顺序问题。 2)下面的例子可以看出构造函数,是优先执行的。 1 C = function (){ 2 alert("1" ); 3 this .a(); 4 alert("2" ); 5 } 6 ...

    1)在看《web前端修炼之道》中对其中一段代码,一直运行不通

     1 function extend(subClass,superClass){
     2     var F=function(){};
     3     F.prototype=superClass.prototype;
     4     subClass.prototype=new F();
     5     subClass.prototype.constructor=subClass;
     6     subClass.superClass=superClass.prototype;
     7     if(superClass.prototype.constructor==Object.prototype.constructor){
     8         superClass.prototype.constructor=superClass;
     9     }
    10 }
    11 
    12 function Animal(name){
    13     this.name=name;
    14     this.type='animal';
    15 }
    16 
    17 Animal.prototype={
    18     say:function(){
    19         alert("I'm a(an)"+this.type+",my name is "+this.name);
    20     }
    21 }
    22 
    23 extend(Bird,Animal);
    24 
    25 function Bird(name){
    26     this.constructor.superClass.constructor.apply(this,arguments);
    27     this.type='bird';
    28 }
    29 
    30 Bird.prototype.fly=function(){
    31     alert('I am flying');
    32 }
    33 
    34 var canary=new Bird('xiaocui');
    35 canary.say();
    36 canary.fly();

    在第26行始终报错,于是开始注意到构造函数的执行顺序问题。

    2)下面的例子可以看出构造函数,是优先执行的。

     1 C = function(){
     2 alert("1");
     3 this.a();
     4 alert("2");
     5 }
     6  
     7 C.prototype.a=function(){
     8 alert("3");
     9 //alert(name);
    10 alert("4");
    11 }

    运行结果为:在构造函数C内,从上到下执行,先弹出1,后调用方法a,弹出3,执行完a后,最后弹出2,全部执行完后,返回一个队形,并将对象的引用(地址)赋给c.

    3)从《javascript高级程序设计》中可以看到,

      a)自定义的类其实就是定义一个构造函数

         b)同时会通过类的prototype定义类的方法

      c)类的prototype包括两部分:指向构造函数的引用,类的方法

          d)通过构造函数生成的实例,都隐含一个指向类的prototype的引用。

     未完待续。。。

    转载于:https://www.cnblogs.com/hugh2006/p/3616216.html

    展开全文
  • 构造函数/静态代码块/普通代码块3. 关于静态代码块和静态变量的顺序4. 总结 1. 概述 本文主要分析在创建对象实例的时候, 类中构造方法的调用顺序或类中成员变量的赋值过程. 2. 构造函数/静态代码块/普通代码块 ...

    1. 概述

    本文主要分析在创建对象实例的时候, 类中构造方法的调用顺序或类中成员变量的赋值过程.

    2. 构造函数/静态代码块/普通代码块

    public class Animal {
    
        public Animal() {
            System.out.println("Animal Constructor.");
        }
    
        static {
            System.out.println("Animal static code.");
        }
    
        {
            System.out.println("Animal normal code.");
        }
    
    }
    public class Cat extends Animal{
    
        public Cat() {
            System.out.println("Cat Constructor.");
        }
    
        static {
            System.out.println("Cat static code.");
        }
    
        {
            System.out.println("Cat normal code.");
        }
    
    }
    public class Dog extends Animal {
    
        public Dog() {
            System.out.println("Dog Constructor.");
        }
    
        static {
            System.out.println("Dog static code.");
        }
    
        {
            System.out.println("Dog normal code.");
        }
    
    }
    public class Main {
    
        public static void main(String[] args) {
    
            new Cat();
            System.out.println("-----------------");
            new Dog();
    
        }
    
    }
    

    输出结果如下

    Animal static code.
    Cat static code.
    Animal normal code.
    Animal Constructor.
    Cat normal code.
    Cat Constructor.
    -----------------
    Dog static code.
    Animal normal code.
    Animal Constructor.
    Dog normal code.
    Dog Constructor.
    

    从输出结果发现, 在创建一个对象的时候, 会发生如下的过程

    1. 查找父类是否被加载过, 没有加载则进行加载, 这时静态代码块随之调用
    2. 加载子类, 子类静态代码块随之调用
    3. 调用父类的普通代码块
    4. 调用父类的构造方法
    5. 调用子类的普通代码块
    6. 调用子类的构造方法

    注意: 在子类的构造方法中, super()必须先被调用, 如果没有写, 运行时会自动调用super()方法. 如果父类没有无参构造方法, 需要手动进行super()的调用.

    总结: 在子类构造方法中, 不管是手动调用父类构造方法还是运行时自动调用, 必须满足: 1. 子类的构造方法必须先调用父类中的某个构造方法; 2. 被子类调用的父类构造方法在父类中必须是存在的.

    反编译class文件, 会发现其实普通代码块的代码被合并到构造方法中了. 但是在构造方法的前面执行了.

    3. 关于静态代码块和静态变量的顺序

    个人建议: 所有的静态变量要定义在静态代码块的前面.

    为什么呢? 因为静态变量和静态代码块的执行顺序是根据代码编写的顺序进行执行的.

    看一个例子

    public class Dog {
    
        public static int num = 10;
    
        static {
            System.out.println("Dog static code.");
    
            // num 可以用于运算输出等
            num = 20;
            System.out.println(num);
        }
    
    }
    

    调用Dog.num时, 正常输出20.

    如果代码如下呢?

    public class Dog {
    
        static {
            System.out.println("Dog static code.");
    
    //        System.out.println(num); // 用于输出时会报错
            num = 5; // 这里只能进行赋值, 实际上这时num本质上还未被定义
        }
    
        public static int num = 10;
    
    }
    

    调用Dog.num时, 会输出10.

    还可以这样.

    public class Dog {
    
        public static void f() {
            System.out.println(num);
        }
    
        static {
            System.out.println("Dog static code.");
            f();
        }
    
        public static int num = 10;
    
    }
    

    虽然不能在静态代码块中输出num, 但是可以调用方法f()进行输出, 这时num为0(初始值), 还未被赋值.

    各种数值/引用类型的初始值:

    数值/引用类型初始值
    byte0
    short0
    int0
    long0
    float0.0
    double0.0
    char空格符
    booleanfalse
    引用类型null

    4. 总结

    本文比较简单, 需要记住如下几点:

    1. 构造函数/静态代码块/普通代码块的执行顺序.
    2. 静态代码块和静态变量的执行顺序与代码位置有关系.
    3. 所有的变量都会有初始值.
    展开全文
  • public class qqqq extends Parent{public static void main(String[] ...}}class Parent{static{System.out.println("父类的静态块执行");}{System.out.println("父类的非静态块执行");}public Parent(){System.out...
  • JavaScript构造函数的内部执行流程

    千次阅读 2019-04-26 10:21:52
    构造函数和普通函数的区别就是调用方式的不同 普通函数是直接调用,而构造函数需要使用new关键字来调用 创建一个新的对象 将新的对象作为函数的上下文对象(this) 执行函数中的代码 将新建的对象返回 以下示例...
  • 构造函数 私有的 构造函数首字母大写 函数内部创建对象 function CreatCar(carName, catAge) { this.carName = carName; //私有的 this.catAge = catAge; } 构造函数原型 公有的 构造函数默认有一个原型...
  • Javascript定义一个函数一般有如下三种方式: ...’) // 由Function构造函数的参数个数可变。最后一个参数写函数体,前面的参数写入参。 上面三种方法定义了同一个方法函数fnMethodName,第1种就是最常
  • 函数与构造函数1.函数1.1函数的arguments1.2函数的length1.3函数的name2.构造函数2.1案例12.2构造函数解析过程2.3案例23.补充new关键字 1.函数 1.1函数的arguments function fn(a,b){ var c=a+b console.log...
  • Day3-构造函数和析构函数 1.知识点总结: 共同点: a.在类中如果没有提供这两个函数,系统默认给这两个函数提供空实现。 b.构造函数和析构函数必须声明在类全局的作用域(public)之下,否则外界是访问不到的 c....
  • 一、普通函数遵循小驼峰命名规则,构造函数遵循大驼峰命名规则 二、普通函数调用直接函数名加上(),括号中可以填入相应的参数;构造函数的调用需要使用关键字new,例子如下: // 普通函数声明 function run () ...
  • 父类,子类 ,构造方法的执行顺序

    千次阅读 2019-01-16 16:07:49
    类(对象)中没有构造器时,是默认会自动创建一个无参构造器的; 当类(对象)中只有有参构造器时,就不会再自动创建一个无参构造器了; 当子类的构造器中没有实现super,默认在调用子类构造方法之间先调用父类的无...
  • 一个派生类构造函数执行顺序如下: 第一步执行:虚拟基类的构造函数(多个虚拟基类则按照继承的顺序执行构造函数)。 第二步执行:基类的构造函数(多个普通基类也按照继承的顺序执行构造函数)。 第三步执行:...
  • 之前有同学问我,js构造函数是怎么执行顺序是什么,所以在这里我就仔细的描述一下带参数的构造函数执行过程  在这里,我介绍一种最靠谱的方法,来亲眼见证构造函数执行过程 1.先简单编写一个构造函数...
  • js中的new操作符和构造函数 new操作符作用于一个普通函数,这个普通函数就变成了构造函数构造函数首字母一般大写; 使用new操作符创建构造函数的实例对象的步骤: 在内存中新创建一个对象; 这个对象的__proto__...
  • 构造函数中有一个属性叫prototype prototype是一个对象属性,其属性值为对象,称为原型对象 可以通过prototype来添加新的属性和方法,此时所有该构造函数创建的对象都会具有这些属性和方法 由该构造函数创建的...
  • 静态方法和构造方法的执行顺序以及代码块的区分 public class Method{ //构造方法 public Method(){ System.out.println("我是构造方法"); } //静态方法 public static void staticMethod(){ System....
  • Promise函数执行顺序

    2021-10-14 22:01:11
    首先执行同步代码, promise() 构造函数中的代码是同步代码, .then和.catch里的是异步代码. 执行顺序: 已申明的函数–>new Promise–>setTimeout;在Promise函数中后执行.then()函数; testFunction() { ...
  • JavaScript函数执行

    2022-04-22 00:27:03
    变量对象是与执行上下文相关的数据作用域,存储了在上下文中定义的变量和函数声明。 因为不同执行上下文下的变量对象稍有不同,所以我们来看看全局上下文下的变量对象和函数上下文下的变量对象。 全局上下文 我们...
  • js中的事件执行顺序梳理

    千次阅读 2022-04-18 21:39:43
    js的事件执行顺序梳理
  • promise构造函数

    2021-10-08 12:48:34
    promise从语法上来说是一个构造函数,从功能上来说,promise对象用来封装一个异步操作并可以获取其成功/失败的结果值。 异步编程有哪些? filesystem操作,数据库操作,ajax请求,定时器。 promise的优点: 1....
  • JS函数定义两种方式及执行顺序

    千次阅读 2018-07-26 10:50:37
    JS函数定义分为函数声明与函数表达式两种,具体定义及执行顺序如下图: 从结果来看, 声明型的函数会在所有的输出前执行,且不论位置在哪。(即声明函数会执行在文档的最前面) 然后console输出及表达式型函数按...
  • JavaScript在页面中的执行顺序 https://blog.csdn.net/superhoy/article/details/52946277 2016年10月27日 15:38:52 阅读数:1258 JavaScript是一种描述型脚本语言,它不同于java或C#等编译性语言,...
  • 1.构造函数继承 在子类构造函数内部使用call或apply来调用父类构造函数 我们先来复习一下call和apply方法。 通过call()、apply()或者bind()方法直接指定this的绑定对象, 如foo.call(obj)使用.call()或者.apply()的...
  • //首先定义一个构造函数Hello function Hello(){  alert(1); } //定义一个函数表达式 var getName = function(){  alert(2); } //实例化对象,下面这两个如果构造函数没有形参的话,实例化的...
  • 不同点:1. 函数的首字母书写方式不同2.... 这样就是为了区分构造函数和普通函数, 让程序员在调用构造函数的时候加上new关键字. <script> // 普通函数 function fn1() { } // 构造函数
  • 定义函数的方法定义函数的方法主要有三种:函数声明(Function Declaration)函数表达式Function Expression)new Function构造函数其中,经常使用的是函数声明和函数表达式的函数定义方法,这两种方法有着很微妙的区别...
  • 哔哩哔哩:JS 异步笔试题,请写出以下代码的执行结果 很多大厂都有过类似的问题,但b站的可谓是坑的最不明显的一个,接下来我们保持清晰的头脑,来用一个非常简单的方法来分析问题,保证看完本篇文章,你再也不会被...
  • Spring中构造器、init-method、@PostConstruct、afterPropertiesSet孰先孰后,自动注入发生时间以及单例多例的区别、SSH线程安全问题 - QiaoZhi - 博客园 https://www.cnblogs.com/qlqwjy/p/9417034.html ...
  • 你必须要学会的js构造函数、原型、原型链

    千次阅读 多人点赞 2022-07-09 09:16:23
    我们可以将name、age、positions作为构造函数的,代码示例如下: 当我们创建构造函数后,我们便可以通过new关键字去调用了: 我们能够发现这一种方式非常的方便,能够大幅度减少我们写重复代码,这

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 67,488
精华内容 26,995
热门标签
关键字:

js构造函数执行顺序