helloap
2015-06-06 22:34
创建对象时,new Object()和Object.create()两者有何异同?
Object.create() 是E5的一个新特性哦,其实可以理解为继承一个对象,create方法有两个参数
一个是要继承的对象的原型,如果没有就传null,第二个参数是对象的属性描述符,这些都是E5才有的~
// Demo var a = new Object(); // 创建一个对象,没有父类哦 var b = Object.create(a.prototype); // b 继承了a的原型
具体对象的原型,属性描述符这些概念可以先去百度学习下哈。我就不详细说了,希望能帮到你
请教下你们怎么懂这些的,我学着很累,听不懂,咋办
使用new Object()创建出来的对象和传入的参数对象是恒等的
详情解说,看图。
var a={}; var a=new Object(); var a=Object.create(Object.prototype);
以上三者相同。
回复 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来实现的 }; }
如果还有不清楚的,欢迎留言讨论。
var a = new Object(b); 代表a的原型指向b;
var a = new Object(); 代表a的原型指向Object吧。
a.prototype 返回的是undefine, 应该是a.constructor.prototype
1L那位同学说错了吧,var a=new Objiect(); //a具有原型Object.prototype
赞赞!
JavaScript深入浅出
281102 学习 · 1020 问题
相似问题