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

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

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

2015-06-06 源自:JavaScript深入浅出 4-4 17092 浏览 11 回答

最佳回答

2015-06-07

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

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

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

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

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

chenhaiping (提问者)

非常感谢!

#1 2016-05-12 回复

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就可以了,希望对你有帮助

#2 2016-06-04 回复

zhangcl 回复 chenhaiping


所以 var b = Object.create(a.prototype); // b 继承了a的原型
这个说法是错误的,应该是b.__proto__=== a.prototype,严格等于
结论:b的原型指向a的prototype属性

#3 2016-06-04 回复
点击展开后面3条评论

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

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

2016-06-12
回复 6

一直都在路上

我想问就是polyfill里的. 如果person2 = Object.create(person1),既然person2._proto_指向的是person1.为何person2._proto_ ===person1是false。但是person2._proto_.===person1.prototype就是true了。是不是 应该指向的是person1的原型对象?

#1 2016-11-26 回复

一直都在路上

我知道了,我__proto__少写了下划线导致undefined===undefined

#2 2016-11-26 回复

http://img.mukewang.com/5955be8400014eb407160707.jpg

详情解说,看图。

2017-06-30
回复 2

weixin_宋杰_3

这里b是一个实例,是没有prototype的,只有一个内部指针,指向构造函数的原型,可以使用b._proto_ === a1访问,这里b.prototype是因为b继承了a1,而a1是一个函数,有一个prototype属性,b也继承了该属性

#1 2018-04-04 回复

1L那位同学说错了吧,var a=new Objiect(); //a具有原型Object.prototype

2016-01-14
回复 1

FroG_0001

人是说它没有父类,对的啊

#1 2016-01-23 回复

zhangcl

var a = new Object();//a的原型指向Object.prototype,a是没有prototype的,在chrome中a的原型用__proto__来表示: a.__proto__ ===Object.prototype;//true

#2 2016-06-04 回复

zhangcl 回复 zhangcl

不好意思,上面a.__proto__ == Object.prototype,a是Object的实例,应该是两个等号

#3 2016-06-04 回复
点击展开后面1条评论

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

2017-03-01
回复 1

赞赞!

2016-01-12
回复 0

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

2016-03-07
回复 0

慕盖茨7302913

a.constructor 是指向构造函数的, 所以 a.constructor === Object, a.constructor.prototype === Object.prototype

#1 2017-07-14 回复

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

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

2016-04-25
回复 0

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的副本,就相当于两个一模一样的苹果,仅仅是长得一样而已,但是它们是不同的对象

#1 2016-06-04 回复

兿芝梅 回复 zhangcl

为何我试了一下,a===b;为true呢?

#2 2016-09-26 回复
var a={};
var a=new Object();
var a=Object.create(Object.prototype);

以上三者相同。

2017-03-24
回复 0

http://img.mukewang.com/599aae080001a69403120171.jpg

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

2017-08-21
回复 0
首页上一页12下一页尾页

举报

0/150
提交
取消
意见反馈 常见问题 APP下载
官方微信