参考:https://www.zhihu.com/question/34183746
https://blog.csdn.net/blueblueskyhua/article/details/73135938
再说区别之前我们先要明确一些相关的概念:
1、对象有属性__proto__
,指向该对象的构造函数的原型对象
2、方法除了有属性__proto__
,还有属性prototype
,prototype
指向该方法的原型对象
再补充一个面试中遇到的问题:Object的原型是什么?
我在控制台打印下面两个值Object.__proto__
和Object.prototype
,得到如下结果:
创建对象的两种方式Obeject.create和new
var Base = function () {}
var o1 = new Base();
var o2 = Object.create(Base);
var o1 = new Base();
的实质:
var o1 = new Object();
o1.[[Prototype]] = Base.prototype;
//[[Prototype]]不能被取到,它相当于o1.__proto__ = Base.prototype
Base.call(o1);
var o2 = Object.create()
的实质:
Object.create = function (o) {
var F = function () {};
F.prototype = o;
return new F();
};
举个例子:
var Base = function () {
this.a = 2
}
Base.prototype.a = 3;
var o1 = new Base();
var o2 = Object.create(Base);
console.log(o1.a);
console.log(o2.a);
综上,他们俩比较明显的区别就是:new关键字创建的对象会保留原构造函数的属性,而用Object.create()创建的对象不会。
instanceof和isPrototypeOf
A.isPrototypeOf(B) :A对象是否存在于B对象的原型链之中
A instanceof B :B.prototype是否存在与A的原型链之中