一、创建一个空对象。
<script>
function Foo(){
}
console.log(new Foo());//Foo{}
</script>
二、将空对象的原型,指向于构造函数的原型。
<script>
function Foo(){
}
console.log(Foo.prototype == new Foo().__proto__);//true
</script>
三、将空对象作为构造函数的上下文(改变this指向)。
<script>
function Foo(){
console.log(this);//window
this.name = '张山';
}
console.log(Foo());//undefined
</script>
<script>
function Foo(){
console.log(this);//Foo{}
this.name = '张山';
}
console.log(new Foo());//Foo{name:'张山'}
</script>
四、对构造函数有返回值的处理。
构造函数是基本类型,则忽略;是引用类型,则用return返回。
<script>
function Foo(){
this.name = '张山';
return 11
}
console.log(new Foo());//Foo{name:'张山'}
</script>
<script>
function Foo(){
this.name = '张山';
return {}
}
console.log(new Foo());//{}
</script>
<script>
function Foo(){
this.name = '张山';
return [1,2,3],
}
console.log(new Foo());//[1,2,3]
</script>
五、自己实现一个构造函数。
<script>
function Fun(age,name){
this.age = age;
this.name = name;
}
function create(fn,...args){
//创建一个空对象
var obj = {};//var obj = Object.create({});
//将空对象的原型,指向于构造函数的原型
Object.setPrototypeOf(obj,fn.prototype);
//改变this指向
var result = fn.apply(obj,args);
//对构造函数有返回值的处理
return result instanceof Object ? result : obj;
}
console.log(create(Fun,18,'张山'));//Fun{age:18,name:'张山'}
</script>