一. 前言
Object.create()方法的作用:创建一个新对象,使用现有的对象来提供新创建的对象的__proto__(会返回一个新对象,带着指定的原型对象和属性)
二. Object.create解析
// 首先自定义一个构造函数并初始化一个实例对象。
function Base(){
this.name = 'cuixiaodao'
}
Base.prototype.say = function (){
console.log(`1:`,1);
}
var base = new Base();
// 创建新对象,指定其隐式原型为Base
var o1 = Object.create(Base);
o1.__proto__ === Base; // true
// 创建新对象,指定其隐式原型为base
var o2 = Object.create(base);
o2.__proto__ === base; // true
默认情况下,js中对象的隐式原型__proto__指向其构造函数的显示原型prototype(这里的指向可以理解为属性与值的关系)
而经过Object.create()方法创建的对象可以指定其隐式原型为一个函数或者对象
三. Object.create()参数为对象和函数的区别
function Base() {
this.name = 'cuixiaodao'
}
Base.age = '18';
Base.prototype.say = function () {
console.log(`1:`, 1);
}
let base = new Base();
let o1 = Object.create(Base);
var o2 = Object.create(base);
console.log(`o1:`,o1);
console.log(`o2:`,o2);
可以看到o1的隐式原型是Base,而o2隐式原型是base
o2可以访问到base上的name属性及base通过__proto__继承来的say方法。
o2.name; // cuixiaodao
o2.say(); // 1
但是o1都访问不到
o1.name; // 'Base'
o1.say; // undefined
主要是因为原型链继承是通过对象的__proto__属性实现的:访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着__proto__这条链向上找,这就是原型链。虽然o1.proto === Base,但由于say方法是定义在Base原型上的,通过o1.__proto__并访问不到,所以是undefined。直接在Base上面定义属性,o1是可以访问到的。
四. Object.crete(null)和{}
Object.crete(null)会返回一个纯净的对象,不会继承内置Object的toString、valueof等方法。
五. 原型链
构造函数的prototype和其实例的__proto__是指向同一个地方的,这个地方就叫做原型对象
Function和Object
Function.prototype === Object.proto;
Function.prototype === Function.proto