JavaScript继承系列之手写Object.create

JavaScript系列之手写Object.create

在开始手写咱们的Object.create方法之前,我们首先来看一种继承方式,那就是原型式继承。

原型式继承,是道格拉斯·克罗克提出的。这种继承方法没有使用严格意义上的构造函数。他的想法是借助原型可以基于已有的对象创建新对象,同时还不必因此创建自定义类型,以下是他提出的函数模型

function object(o){
	function F(){}
	F.prototype = o
	return new F()
}

步骤如下
1.创建一个临时性的构造函数
2.将传入的对象作为这个构造函数的原型
3.最后返回了这个临时类型的一个新实例。

我们看下面的例子

var person = {
	age:18,
	friend:['gray','amili','adward']
	var anotherPerson = object(person)
	anotherPerson.name = "Greg"
	anotherPerson.friends.push("Rob")
	
	var secondPerson = object(person)
		secondPerson.name = "Linda"
		secondPerson.friends.push("Barbie")
	
	alert(person.friends)  // "'gray','amili','adward',"Rob""Barbie""
}

实际上,object()对传入其中的对象执行了一次浅拷贝
如此,因为传入的person对象当中,包括了friends这个引用类型,所以
anotherPerson和secondPerson这两个对象在继承了person之后
会共享同一个friend数组,这在Object.create()函数中也是如此

var instance1 = Object.create(person)
var secondPerson = Object.create(person)
instance1.friend.push('youxiu')
secondPerson.friend.push('hhhh')
console.log(secondPerson.friend)
//[ 'gray', 'amili', 'adward', 'youxiu', 'hhhh' ]

而实际上,在只传入一个对象的时候,Object.create()与上述object方法是完全一样的,下面我们实现可传递参数的手写object.create()

function object_create(obj){
	var args = [].slice.call(arguments,1)
	for(let i of args){
		Object.assign(obj,i)
	}
	function F(){}
	F.prototype = obj
	return new F(args)
}
var person = {
	age:18,
	friend:['gray','amili','adward']
}
var instance1 = object_create(person,{sex:"male"})
console.log(instance1.sex) //male

至此,我们成功过实现了Object.create()的功能


感谢大家的阅读,非常欢迎大家能够批评指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值