• new到底做了什么?


    下面是一个实例化自定义的对象,我们将要对他进行分析

    //定义构造函数
    function A(){
        this.b = 1 //在这个对象里增加一个属性
        //不可以拥有返回对象的return语句
    }
    var obj = new A() //实例化一个对象
    console.log(obj) //{ b: 1 }

     

    在这个过程中new到底做了什么?

    下面针对分析new A():

    1.构造函数拥有一个叫prototype的属性,这里即A.prototype,这个对象默认有一个属性constructor,他的值是这个构造函数A。

    2.javascript先创建一个空对象,先叫它做临时对象,它继承A.prototype的所有属性。

    3.当A()开始执行,设置A的this指向这个临时对象,然后继续执行函数A。

    4.如果没有返回语句,或者是返回对象的语句,那么返回的就是这个临时对象,否则返回的我们返回的对象。

     

    当由构造函数进行对象实例化时,返回的对象是继承的谁?

    先给出准确的解释

    1.当没有返回语句,或者返回对象的语句时,返回的对象继承自a.prototype。

    2.当返回的是一个对象时,主义,返回的对象是我们自己创建的对象,所以它继承自它构造函数的原型。

    没有返回对象时:

    //没有返回对象时
    function A(){
        this.b = 1
    }
    var obj = new A() 
    console.log(Object.getPrototypeOf(obj) === A.prototype) //true

    有返回对象时

    //返回对象时
    function A(){
        return { b:1}
    }
    var obj = new A() 
    console.log(Object.getPrototypeOf(obj) === A.prototype) //true
    console.log(Object.getPrototypeOf(obj) === Object.prototype) //true

     

    对已经实例化的对象的构造函数原型进行修改时,并不影响这个实例化对象

    这里有一个实例可以说明这个现象

    function A(){
        this.b = 1
    }
    var obj = new A() 
    A.prototype = {b:10}
    console.log(obj.b) //1
  • 相关阅读:
    3spring:生命周期,属性赋值,自动装配
    2spring注解:@Lazy,@Conditional,@import,FactoryBean接口
    1spring注解:@Configuration,@Bean,@ComponentScan(),@Scope
    10.spring:常用的数据库代码.....(不长使用了解即可)
    9.spring:事务管理(下):声明式事务管理
    原生JavaScript实现hasClass、addClass、removeClass、toggleClass
    表格去重复边框
    缓存工厂之Redis缓存
    【实践】Memcached实例解析
    c# is和as的区别
  • 原文地址:https://www.cnblogs.com/winderby/p/4057074.html
Copyright © 2020-2023  润新知