new
function _new() {
let args = [].slice.call(arguments)
let constructor = [].shift.call(args)
// Object.create()返回一个新对象,这个对象的构造函数的原型指向Foo
let obj = Object.create(constructor.prototype)
let result = constructor.apply(obj, args)
return (typeof result === 'object' && result != null) ? result : obj
}
参考: javaScript深入之new的模拟实现
是什么:
创建一个用户定义的类型对象的实例,或具有构造函数的内置对象类型之一
举个🌰吃
function Person (name, age) {
this.name = name
this.age = age
}
Person.prototype.hobby = 'coding'
Person.prototype.saySome = function() {
console.log(`I am ${this.name}`)
}
var person = new Person('Jamie', 18)
console.log(person.saySome)
console.log(person.hobby)
实现了什么:
1 实例可以访问到他的构造函数上的属性
2 实例也可以访问到他构造函数的原型上的属性
怎么实现
思路:
1 new 出来一个新的对象 (建立一个对象obj)
2 给obj 添加 构造函数的 属性 (apply(obj, arguments))
3 实例的—proroto–指向他的构造函数的原型对象()
function new (){
var obj = new Object,
constructor : [].shift.call(arguments)//获取传入的第一个参数
obj.__proto__ = constructor.prototype
construcor.apply(obj, arguments) // 给obj 添加新属性吧constuctor 的属性给到示例
return obj
}
特殊情况:构造函数有返回值的情况怎么办?
(如果是一个对象,我们就返回这个对象,如果没有,我们该返回什么就返回什么)
function _new () {
let obj = new Object(),
Constructor = [].shift.call(...arguments)
obj.__proto__ = Construcor.prototype
var ret = Constructor.apply(obj, arguments);
return typeof ret === 'object' ? ret : obj;
}