请问老师new Object()和Object.create()两者有何异同?
创建对象时,new Object()和Object.create()两者有何异同?
创建对象时,new Object()和Object.create()两者有何异同?
2015-06-06
回复 zhangcl:挖坟说一下。首先,var a=new Object();a是构造函数Object创建的对象。所以,a不存在prototype属性。只有函数存在prototype属性,而任何被创建的对象,包括函数都有一个__proto__属性,构成了对象的原型链。所以var b = Object.create(a.prototype); 这句话就是错的。a.prototype根本不存在。alert一下显示undifined。这句话直接写成var b=Object.create(a);就可以了。b的原型对象是a。Object.creat的实现就像楼上说的。而假如像楼上所说,第二句想写出 var b=Object.create(a.constructor.prototype)。那么a.constructor.prototype=Object.prototype。实际上第二句就和var b=new Object()差不多了。但是还是存在点小问题。因为Object.create的实现类似于:
//Object.create(Object.prototype) function fn(){}; fn.prototype=Object.prototype; return new fn();
所以, var b=Object.create(a.constructor.prototype);这句b虽然是Object的对象,却没有被构造函数Object初始化。就这点小区别。不知道我理解的对不对。
简单来讲,new Object()是一种通过构造函数来创建object的方式,而Object.create(proto, [ propertiesObject ])
不需要通过构造函数就可以创建一个object,Object.create()的第一个参数是必须要的,第二个参数可选。其实Object.create()内部依然是通过new一个构造函数的方式来实现的,它有构造函数,不过这个构造函数是隐式存在的,看一下使老旧浏览器支持Object.create方法的“polyfill”就可以对它们之间的区别一目了然了:
if (!Object.create) { Object.create = function (o) { function F() {} //定义了一个隐式的构造函数 F.prototype = o; return new F(); //其实还是通过new来实现的 }; }
如果还有不清楚的,欢迎留言讨论。
举报