new 关键字执行后总会返回一个对象,要么是实例对象,要么是 return 语句指定的对象
function Person(){
this.name = 'Jack';
}
var p = new Person();
console.log(p.name) // Jack
function Person(){
this.name = 'Jack';
return {age: 18}
}
var p = new Person();
console.log(p) // {age: 18}
console.log(p.name) // undefined
console.log(p.age) // 18
function Person(){
this.name = 'Jack';
return 'tom';
}
var p = new Person();
console.log(p) // {name: 'Jack'}
console.log(p.name) // Jack
构造对象过程
- 创建一个全新的对象
- 新对象会被执行 prototype 操作
- 新对象会被绑定到函数调用的 this
如果函数没有返回新对象,new 表达式中的函数调用会自动返回这个新对象(对于一个构造函数,即使它内部没有return,也会默认返回return this)
function objectFactory(){
var obj = new Object();
//shift() 方法从数组中删除第一个元素,并返回该元素的值。
//取出第一个参数,就是我们要传入的构造函数。
//此外因为 shift 会修改原数组,所以 arguments 会被去除第一个参数
Constructor = [].shift.call(arguments);
//将 obj 的原型指向构造函数,这样 obj 就可以访问到构造函数原型中的属性
obj.__proto__ = Constructor.prototype;
//使用 apply,改变构造函数 this 的指向到新建的对象,这样 obj 就可以访问到构造函数中的属性
var ret = Constructor.apply(obj,arguments);
//判断返回的值是不是一个对象,如果是一个对象,我们就返回这个对象,
//如果没有,我们该返回什么就返回什么。
return typeof ret === 'object' ? ret : obj;
}
题目
```javascript var p = [2, 3]; var A = new Function(); A.prototype = p;
console.log(A.prototype)
var a = new A;
console.log(a.proto)
a.push(1);
console.log(a.length); // 3 console.log(p.length); // 2 ```