赞
踩
#
baseCreate不能以名称而去定义该方法的作用,它并不只是为了创建一个对象,其可以理解为"创建一个继承了指定对象的对象",并且创建后的对象是不存在原型对象,即prototype
,相比 Object.assign 从 create 名称上来说到不如是用指定对象生成了一个新的对象,所以 Object.create 一个指定对象的新的实例对象,只不过这个指定的对象通常是原型对象
ES5之前的版本不支持将参数 ptoto 设置为 null
function A(){
}
A.prototype.name = 'AA'
let b = Object.create(A.prototype)
console.log(b.name) //=> AA
b.__proto__.name = 'BB'
console.log(A.prototype.name) //=> AA
let c = Object.assign({
}, A.prototype)
console.log(c.name) //=> AA
c.__proto__.name = 'BB'
console.log(A.prototype.name) //=> BB
Lodash.#baseCreate()
私有方法也是实现了 Object.create 方法的作用,其源码如下:
var baseCreate = (function() { // 准备全新的构造器 function object() { } return function(proto) { if (!isObject(proto)) { return { }; } // 如果支持 Object.create 则直接使用 if (objectCreate) { return objectCreate(proto); } // 准备对象实例化原型为指定原型 object.prototype = proto; var result = new object; // 丢掉返回对象的类原型对象 object.prototype = undefined; return result; }; }());
以下是摘录 lodash 与 LodashWrapper 部分的拟源码:
function _Lodash(){ } _Lodash.prototype.name = 'AA' function _LodashWrapper(){ } console.log( (new _LodashWrapper()).name ) //=> undefined // 指定 _LodashWrapper 原型只是以 _Lodash.prototype 对象创建出来的新对象 // 也就是说这个新对象只是 _Lodash.prototype 的一个实例对象,并不就是 _Lodash.prototype 这个原型对象本身 // 而这个对象的 __proto__ 指向的是 _Lodash.prototype // 也就是 _LodashWrapper.prototype 实例对象继承的 _Lodash 原型对象 _LodashWrapper.prototype = Object.create(_Lodash.prototype) _LodashWrapper.prototype.constructor = _LodashWrapper console.log( (new _LodashWrapper()).name ) //=> AA _Lodash.prototype.age = 20 console.log( (new _LodashWrapper()).age
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。