js方法实现 ---- new

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值