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()的功能
感谢大家的阅读,非常欢迎大家能够批评指正!