1.js构造函数返回值问题
- 构造函数本不应该,不需要有返回值,实际执行的返回值就是此构造函数的实例化对象
- 但是在 js 中构造函数可以有返回值也可以没有,没有时,和正常的构造函数一样,返回实例化对象
- 返回值是非引用类型,如基本类型(string,number,boolean,null,undefined)则与无返回值相同
- 返回值是是引用类型,则实际返回值为这个引用类型,就会出现问题
注意:构造函数中的 this 指向实例化的对象,所以构造函数通过 this 给实例添加属性和方法
function foo(name){
return name
}
// 1. 返回值为非引用类型
// a为foo构造函数实例化出来的一个空对象
var a = new foo('字符串')
console.log(a) // foo{}
console.log(typeof a) // 'object'
a.__proto__ == foo.prototype // true
// 2. 返回值为引用类型
// b为返回的引用对象,不属于构造函数的实例了
var b = new foo({name:'对象'})
console.log(b) // {name:'对象'}
console.log(typeof b) // 'object'
b.__proto__ == foo.prototype // false
2.牛客网面试题
- 我们来看下牛客网的一道题
- String(‘foo’) 返回的是string类型,非引用类型,所以不会影响,因为构造函数没有属性,返回一个空对象
- new String(‘foo’) 返回的是字符串对象,所以会返回该字符串对象
console.log( 'foo' == new function(){ return String('foo') } ) // false
console.log( 'foo' == new function(){ return new String('foo') } ) // true