语法
Object.create(proto,[propertiesObject])
参数
proto
新创建对象的原型对象。
propertiesObject
可选。需要传入一个对象,该对象的属性类型参照Object.defineProperties()的第二个参数。如果该参数被指定且不为 undefined,该传入对象的自有可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)将为新创建的对象添加指定的属性值和对应的属性描述符。
返回值
一个新对象,带着指定的原型对象和属性。
例外
如果proto
参数不是 null 或非原始包装对象,则抛出一个 TypeError 异常。
实现流程:
1,判断第一个参数的类型是不是object或者函数
- 判断第二个参数的类型,不能是null
- 创建新函数,把新函数的原型(prototype)指向第一个参数
- 创建新函数的实例 new
- 如果第二个参数不是undefined,则需要把其(属性)添加在实例上 Object.defineProperties
- 如果第一个参数为空(null),把其原型指向null(obj.__proto__=null)
Object.create1=function(proto,propertyObject=undefined){
//如果proto参数不是 null 或非原始包装对象
if(typeof proto !=='object' && typeof proto !=='function'){
throw new TypeError('Object prototype may only be an Object or null.')
}
//属性不可以传入null
if(propertyObject==null){
throw new TypeError('无法将未定义或null转换为对象')
}
//创建函数
function F(){}
//函数的原型,指向传入的构造函数
F.prototype=proto
//创建实例
const obj=new F()
if(propertyObject!==undefined){
//往obj上添加属性
Object.defineProperties(obj,propertyObject)
}
if(proto==null){
//创建一个没有原型的对象
obj.__proto__=null
}
return obj
}