Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__
语法:
Object.create(proto, [propertiesObject])
proto : 必须。表示新建对象的原型对象,即该参数会被赋值到目标对象(即新对象,或说是最后返回的对象)的原型上。该参数可以是null, 对象, 函数的prototype属性 (创建空的对象时需传null , 否则会抛出TypeError异常)
propertiesObject : 可选。 添加到新创建对象的可枚举属性(即其自身的属性,而不是原型链上的枚举属性)对象的属性描述符以及相应的属性名称。这些属性对应Object.defineProperties()的第二个参数。
两种创建方式
// new Object() 方式创建
var a = { rep: 'apple' }
var b = new Object(a)
console.log(b) // {rep: "apple"}
console.log(b.__proto__) // {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}
console.log(b.rep) // apple
// Object.create() 方式创建
var a = { rep: 'apple' }
var b = Object.create(a)
console.log(b) // {}
console.log(b.__proto__) // {rep: "apple"}
console.log(b.rep) // apple
当第一个参数为null时
var newObj = Object.create(null)
console.log(newObj) // {}
console.log(Object.getPrototypeOf(newObj)) // null
var obj = {}
console.log(obj) // {}
console.log(Object.getPrototypeOf(obj)) // {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}
我们都知道Object构造函数的原型最终指向null,Object.create()的第一个参数是新对象的原型。所以当我们把第一个参数设置为null的时候,让新对象的原型直接指向null,这样中间的原型链就断开了,这个时候你可以自定义你自己的原型上的方法了。比如说toString方法。
深拷贝
function deepClone(origin) {
// 获取origin的原型对象
var originProto = Object.getPrototypeOf(origin)
// 将这个原型作为新对象的原型
var newObj = Object.create(originProto)
// 这时候newObj是个空对象,它的原型与origin的原型相等,这个时候合并对象属性
return Object.assign(newObj,origin)
}
var obj1 = {
a: 1
}
var obj2 = deepClone(obj1)
obj2.b = 8
console.log(obj1) // {a: 1}
console.log(obj2) // {a: 1, b: 8}
console.log(Object.getPrototypeOf(obj1) === Object.getPrototypeOf(obj2)) // true
继承
var Parent = {
getName: function() {
return this.name
},
getAge: function() {
}
}
var child = Object.create(Parent,{
name: {
value: '张三'
},
age: {
value: 18
}
})
console.log(child.getName()) // 张三