目的:本文记录了我对于 构造函数不同类型返回值对实例的影响 的学习心得。
前言:我们知道构造函数用new操作符创建实例一般是函数体内是不需要返回值的。但是构造函数的本质首先还是个函数,作为函数就能有返回值,而且在某些情况下(比如使用parasitic构造函数的设计模式)会用到构造函数的返回值。本文写作目的在于记录不同类型(基本类型、引用类型)返回值对实例的影响。
正文:
part1:基本类型
1 function Person (name) {2 this.name=name;3 return 123;4 }5 var a=new Person("Su");6 console.dir(a); //Person
结果:基本类型的返回值被忽略。
part2:引用类型
1 function Person (name) {2 var arr=[];3 this.name=name;4 return arr;5 }6 var a=new Person("Su");7 console.dir(a) //Array[0]
结果:a没有成为Person的实例而是如返回值一样成为了数组。
分析:
为了了解这种差异的原因,我首先去研究了new 这个过程,在用new操作符创造实例时,会经历如下4个阶段:
1.创建一个新对象,此时该对象为空对象。
2.将构造函数的作用域赋给这个空对象(因此构造函数中的this就指向了该空对象)
3.执行构造函数内的代码(由于this指向了该空对象,此步骤为新对象添加属性)
4.返回新对象(这里针对构造函数没有返回值或返回值为基本类型时。如果构造函数内有引用类型的返回值,那么该返回值会替代第一步创建的对象作为构造函数的返回值。)
function Person (name) { var arr=[]; this.name=name; return arr; } var a=new Person("Su");console.dir(a.constructor); //function Array()
还是这段代码,a作为Person的实例被创造,结果他的构造函数却不是Person而是Array,可见返回值被覆盖了。
结论:
构造函数的返回值会影响实例。
1.不设置返回值或返回值为基本类型时返回值为构造函数在构造实例过程中创建的对象。
2.设置返回值为引用类型时返回值会覆盖构造函数在构造实例过程中创建的对象,此时实例其实已经与构造函数没有关系了,而是作为该引用类型的实例。
原标题:构造函数返回值 学习心得
关键词:函数