new 关键字执行后总会返回一个对象,要么是实例对象,要么是 return 语句指定的对象

  1. function Person(){
  2. this.name = 'Jack';
  3. }
  4. var p = new Person();
  5. console.log(p.name) // Jack
  1. function Person(){
  2. this.name = 'Jack';
  3. return {age: 18}
  4. }
  5. var p = new Person();
  6. console.log(p) // {age: 18}
  7. console.log(p.name) // undefined
  8. console.log(p.age) // 18
  1. function Person(){
  2. this.name = 'Jack';
  3. return 'tom';
  4. }
  5. var p = new Person();
  6. console.log(p) // {name: 'Jack'}
  7. console.log(p.name) // Jack

构造对象过程

  1. 创建一个全新的对象
  2. 新对象会被执行 prototype 操作
  3. 新对象会被绑定到函数调用的 this
  4. 如果函数没有返回新对象,new 表达式中的函数调用会自动返回这个新对象(对于一个构造函数,即使它内部没有return,也会默认返回return this)

    1. function objectFactory(){
    2. var obj = new Object();
    3. //shift() 方法从数组中删除第一个元素,并返回该元素的值。
    4. //取出第一个参数,就是我们要传入的构造函数。
    5. //此外因为 shift 会修改原数组,所以 arguments 会被去除第一个参数
    6. Constructor = [].shift.call(arguments);
    7. //将 obj 的原型指向构造函数,这样 obj 就可以访问到构造函数原型中的属性
    8. obj.__proto__ = Constructor.prototype;
    9. //使用 apply,改变构造函数 this 的指向到新建的对象,这样 obj 就可以访问到构造函数中的属性
    10. var ret = Constructor.apply(obj,arguments);
    11. //判断返回的值是不是一个对象,如果是一个对象,我们就返回这个对象,
    12. //如果没有,我们该返回什么就返回什么。
    13. return typeof ret === 'object' ? ret : obj;
    14. }

    题目

    ```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 ```