function Person(name, age) { this.name = name; this.age = age}var person = new Person('小明', 18);console.log(person.name); //小明console.log(person.age); //18复制代码
执行new
命令会经过以下几个步骤
- 创建一个空对象,这个对象将会是
new Person()
返回的对象实例;- 将这个空对象的原型指向
构造函数
的prototype
属性;- 将
构造函数
的this
指向空对象,并运行构造函数
;- 判断
构造函数
返回的是不是对象
,是的话返回默认对象
,不是的话返回之前创建的空对象
,没有返回值默认返回空对象
用代码解释一下
function Person(name, age) { this.name = name; this.age = age //return '小明' //如果返回的不是Object类型,将忽略这个return 返回之前创建的空对象 /* return { //如果返回的是Object类型,直接返回这个对象 'name' : '小花', 'age' : 22 } */}function _new(person, ...rest){ var obj = {}; // 创建一个空对象,这个对象将会是返回的对象实例 obj.__prototype__ = person.prototype; // 将这个空对象的原型指向person的prototype属性; //上述两步可以合为一步 : var obj = Object.create(person.prototype) var res = person.apply(obj, rest); // 将person的this指向空对象,并运行person函数,apply命令绑定this后就会运行person return (typeof res === 'object' && res != null) ? res: obj; // 判断res返回的是不是对象,是的话返res,不是的话返回之前创建的obj,没有返回值默认返回obj}var xiaoming = _new(Person, '小明', 15)console.log(xiaoming .name); //小明console.log(xiaoming .age); //15复制代码
本篇如能对您有所帮助,实在是感到荣幸。如有不合理之处也请大家多多指点。