- 创建了一个空的对象(每一个对象都是由构造函数构建出来的)
javascript
<script>
function Foo(){}
console.log( new Foo() ); // 打印出了一个空对象
</script>
- 将空对象的原型(对象原型)指向构造函数的原型(原型对象)
javascript
<script>
function Foo(){}
console.log( Foo.prototype == new Foo().__proto__ ); // true
</script>
- 将空对象作为构造函数的上下文(改变了this指向)
javascript
/* 此时的this代表的是window */
<script>
function Foo(){
console.log( this );
this.name = '张三'; // window对象上并没有name
}
console.log( Foo() );
</script>
/* new了之后this就代表new出来的对象了 */
<script>
function Foo(){
console.log( this );
this.name = '张三'; // this代表new Foo()这个对象
}
console.log( new Foo() );
</script>
- 对构造函数有返回值的处理判断
javascript
/* 如果返回的是基本数据的话对结果没有影响,会被忽略 */
<script>
function Foo(){
this.name = '张三'
return 11111;
}
console.log( new Foo() ); // 打印出的结果是new出来的对象 Foo {name: '张三'}
</script>
/* 如果返回的是引用类型的数据,那么结果就会使用return返回的数据(new就没用了) */
<script>
function Foo(){
this.name = '张三'
return [1,2,3];
}
console.log( new Foo() ); // 打印出的结果是[1,2,3]
</script>
- 自己简单实现一下new的过程
javascript
/* 官方是通过构造函数new出来的对象 */
<script>
function Fun( age ) {
this.age = age;
}
console.log( new Fun(18) )
</script>
/* 自己写实现new的效果 */
<script>
function Fun( age,name ) {
this.age = age;
this.name = name;
return 111111;
}
function create( fn, ...args ) {
console.log( args ); // 此时args就是个数组[18,'张三']
// 1. 创建一个空对象
var obj = {};
// 2. 把空对象的原型指向构造函数的原型
Object.setPrototypeOf(obj,fn.prototype);
// 3. 将空对象作为构造函数的上下文(改变this指向)
var result = fn.apply(obj,args);
// 4. 对构造函数有返回值的处理判断
return result instanceof Object ? result : obj;
}
console.log( create(Fun,18,'张三') );
</script>