为了账号安全,请及时绑定邮箱和手机立即绑定

请问老师new Object()和Object.create()两者有何异同?

创建对象时,new Object()和Object.create()两者有何异同?

正在回答

12 回答

Object.create() 是E5的一个新特性哦,其实可以理解为继承一个对象,create方法有两个参数

一个是要继承的对象的原型,如果没有就传null,第二个参数是对象的属性描述符,这些都是E5才有的~

// Demo
var a = new Object();  // 创建一个对象,没有父类哦

var b = Object.create(a.prototype);  // b 继承了a的原型

具体对象的原型,属性描述符这些概念可以先去百度学习下哈。我就不详细说了,希望能帮到你

3 回复 有任何疑惑可以回复我~
#1

helloap 提问者

非常感谢!
2016-05-12 回复 有任何疑惑可以回复我~
#2

zhangcl

上面说错了: 第一种: var a = {x:1}; var b = Object.create(a); console.log(b);//输出:{}; console.log(b.__proto__);//输出:{x:1} 第二种: 如果用 b =new object(a) connsole.log(b);//输出:{x:1} congsole.log(b.__proto__);//输出:{} 只要注意区分__proto__和prototype就可以了,希望对你有帮助
2016-06-04 回复 有任何疑惑可以回复我~
#3

zhangcl 回复 helloap 提问者

所以 var b = Object.create(a.prototype); // b 继承了a的原型 这个说法是错误的,应该是b.__proto__=== a.prototype,严格等于 结论:b的原型指向a的prototype属性
2016-06-04 回复 有任何疑惑可以回复我~
#4

真的是超神哥 回复 zhangcl

这个回复比较靠谱。+1
2017-03-11 回复 有任何疑惑可以回复我~
#5

慕UI5536701 回复 zhangcl

特意注册了个账号来回复...纠正你说的一些错误说法.1:"b的原型",因为b是实例,而非构造函数,所以无原型一说;2:"b.__proto__",这表示b的构造函数的原型,俗称原型链,层主说的"b继承了a的原型"是没毛病的 建议你多了解一下js的原型和原型链指向图
2017-06-27 回复 有任何疑惑可以回复我~
#6

慕UI5536701 回复 慕UI5536701

层主也写错了,a是普通对象,不存在prototype值,所以下面一句会报错,应该写成"var b = Object.create(a)",即b继承a,因为a在b的原型链上
2017-06-27 回复 有任何疑惑可以回复我~
查看3条回复

厉害可以这么简洁!输出效果也能一样学到知识了

spd10000pahzfbdyonhddendvolsaehoybztjrnyddnmvfzy

0 回复 有任何疑惑可以回复我~

请教下你们怎么懂这些的,我学着很累,听不懂,咋办

0 回复 有任何疑惑可以回复我~

http://img1.sycdn.imooc.com//599aae080001a69403120171.jpg

使用new Object()创建出来的对象和传入的参数对象是恒等的

0 回复 有任何疑惑可以回复我~

http://img1.sycdn.imooc.com//5955be8400014eb407160707.jpg

详情解说,看图。

2 回复 有任何疑惑可以回复我~
#1

慕侠4705823

这里b是一个实例,是没有prototype的,只有一个内部指针,指向构造函数的原型,可以使用b._proto_ === a1访问,这里b.prototype是因为b继承了a1,而a1是一个函数,有一个prototype属性,b也继承了该属性
2018-04-04 回复 有任何疑惑可以回复我~
var a={};
var a=new Object();
var a=Object.create(Object.prototype);

以上三者相同。

0 回复 有任何疑惑可以回复我~

回复 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初始化。就这点小区别。不知道我理解的对不对。

1 回复 有任何疑惑可以回复我~

简单来讲,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来实现的
    };
  }

如果还有不清楚的,欢迎留言讨论。

6 回复 有任何疑惑可以回复我~
#1

一直都在路上

我想问就是polyfill里的. 如果person2 = Object.create(person1),既然person2._proto_指向的是person1.为何person2._proto_ ===person1是false。但是person2._proto_.===person1.prototype就是true了。是不是 应该指向的是person1的原型对象?
2016-11-26 回复 有任何疑惑可以回复我~
#2

一直都在路上

我知道了,我__proto__少写了下划线导致undefined===undefined
2016-11-26 回复 有任何疑惑可以回复我~

var a = new Object(b);    代表a的原型指向b;

var a = new Object();     代表a的原型指向Object吧。 

0 回复 有任何疑惑可以回复我~
#1

zhangcl

var a = new Object();//a的原型指向Object的prototype属性,和b没关系 比如说: var a =new Object({x:1}),这里b = {x:1},那么a和b都是Object的实例,a和b的原型都是Object.prototype; a==b;//true a===b;//false 表示a和b是两个不同的对象,他们的属性一样,a创建了一个b的副本,就相当于两个一模一样的苹果,仅仅是长得一样而已,但是它们是不同的对象
2016-06-04 回复 有任何疑惑可以回复我~
#2

兿芝梅 回复 zhangcl

为何我试了一下,a===b;为true呢?
2016-09-26 回复 有任何疑惑可以回复我~

a.prototype 返回的是undefine, 应该是a.constructor.prototype 

0 回复 有任何疑惑可以回复我~
#1

慕盖茨7302913

a.constructor 是指向构造函数的, 所以 a.constructor === Object, a.constructor.prototype === Object.prototype
2017-07-14 回复 有任何疑惑可以回复我~
首页上一页12下一页尾页

举报

0/150
提交
取消

请问老师new Object()和Object.create()两者有何异同?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信