javascript——new

1,364 阅读2分钟

创建对象的方式(3种)

1.字面量

let obj = {
	name:'Tom',
    age:12
}

2.new

function People(name,age){
    this.name = name;
    this.age = age;
    console.log("name:"+name+",age:"+age);
}

let tom = new People('Tom',12);//name:Tom,age:12

new中主要做了三件事:

  1. 返回一个新的对象。
  2. 把构造函数的this指向这个新的对象
  3. 把新对象的__proto__指向构造函数的prototype

当构造函数没有返回值或者返回值是基础数据类型的时候,使用new的时候会返回一个实例对象。而当构造函数的返回值是Object、Array、Function等引用类型的时候,使用new会返回这个引用类型。

根据以上信息就可以实现一个手写的new

//context 表示要使用的构造函数 arguments是传入的参数
function myNew(context){
    let obj = {};//新建一个对象
    obj.__proto__ = context.prototype;//把实例对象的原型指向构造函数的原型对象
    let result = context.apply(obj,[].slice.call(arguments,1));//绑定this  传入参数
    return result instanceof Object ? result : obj;

}

function People(name,age){
    this.name = name;
    this.age = age;
    console.log("name:"+name+",age:"+age);
}

let Jim = myNew(People,'Jim',12);
console.log(Jim);

3.Object.create()

Object.create()方法创建一个新对象,使用现有的对象来作为新创建的对象的__proto__

let woman = {
    sex:'女',
    work:'IT'
}
let lili = Object.create(woman);
lili.name = 'lili';//增加属性
lili.age = 12;
console.log(lili);

三种的区别

字面量创建和new关键字创建并没有区别,创建的新对象的__proto__都指向Object.prototype,都会继承 Object 的属性和方法。只是字面量创建更高效一些,少了__proto__指向赋值和this。

而通过 Object.create(null) 创建的对象,其原型指向 null , null 作为原型链的顶端,没有也不会继承任何属性和方法。