定义

new 运算符创建一个用户自定义的对象类型的实例或具有构造函数的内置对象的实例。

  1. function Person(name) {
  2. this.name = name
  3. }
  4. Person.prototype.sayHello = function () {
  5. console.log('name', this.name)
  6. };
  7. var person = new Person('name');
  8. person.name //name
  9. person.sayHello(); // name name

new 操作符创建的实例可以访问到构造函数里的属性,可以访问到原型里的属性。

注意点

ES6的Symbol类型,不可以使用new Symbol(),Symbol是基本数据类型,每个从Symbol()返回的值是唯一的。

  1. Number("123"); // 123
  2. String(123); // "123"
  3. Boolean(123); // true
  4. Symbol(123); // Symbol(123)
  5. new Number("123"); // Number {123}
  6. new String(123); // String {"123"}
  7. new Boolean(true); // Boolean {true}
  8. new Symbol(123); // Symbol is not a constructor

实现

执行new Foo()操作符时

  1. 一个继承自Foo.prototype的新对象被创建。
  2. 使用指定的参数调用构造函数Foo,并将this绑定到新创建的对象。new Foo 等同于 new Foo(),也就是没有指定参数列表,Foo 不带任何参数调用的情况。
  3. 由构造函数返回的对象返回的就是new表达式的结果。如果构造函数没有显示的返回一个独享,那么久使用步骤1创建的对象。

第一步

  1. function create() {
  2. var obj = new Object();
  3. // 获取构造函数
  4. Con = [].shift.call(arguments);
  5. // 链接到原型
  6. obj.__proto__ = Con.prototype;
  7. //绑定this实现继承
  8. Con.apply(obj, arguments);
  9. return obj
  10. }

第二部

第一步实现中的函数有一部分还需要优化。构造函数的返回值有三种情况:返回一个对象。返回undefined,返回其他类型。对于返回一个对象的情况,则实例中只能访问到返回对象中的属性。当返回undefined的时候,实例中只能访问到构造函数中的属性。当返回其他类型的时候,与第二种情况相同。

  1. function create() {
  2. var obj = new Object();
  3. var Con = [].shift.call(arguments);
  4. obj.__proto__ = Con.prototype;
  5. var ret = Con.call(obj, arguments);
  6. return ret instanceof Object ? ret : obj
  7. }

自己实现

  1. function myNew(Func,...arg){
  2. // 创建一个对象,对象要继承Func的原型
  3. const obj = Object.create(Func.prototype)
  4. const result = Func.apply(obj,arg)
  5. // 执行构造方法
  6. // 方法返回的是对象将 返回的对象返回,否则返回创建的对象
  7. if(typeof result === "object" && result !== null){
  8. return result
  9. }
  10. return obj
  11. }