通过Object.create()方法创建一个新对象,使新对象的__proto__原型指向通过create传入的对象
let foo = {
age:10
};
let f = Object.create(foo);
console.log(f.age);//10
create的内部原理
Object.create => function(obj){
var f = function(){};
f.prototype = obj;
return new f();
}
- 先在内部创建一个空构造函数
- 把构造函数的原型指向传进来的obj对象
- 通过new创建对象并返回
因此新创建出来的对象调用的属性和方法都会去传入对象上去找
实例说明
function foo1(){
this.age = 10;
}
foo1.__proto__.height = 30;
let foo2 = {
age:20
};
let fo1 = new foo1();
let f0 = Object.create(foo1);
let f1 = Object.create(fo1);
let f2 = Object.create(foo2);
console.log(f0.age);//undefined
console.log(f0.height);//30
console.log(f1.age);//10
console.log(f2.age);//20
console.log(f0.__proto__ == foo1)//true
console.log(f2.__proto__ == foo2)//true
console.log(foo1.__proto__ == Function.prototype)//true
Object.create的第一个参数是一个对象,这个对象将作为通过create创建的新对象 的原型对象,即f2.proto == foo2,第二个参数是可选参数,如果没有指定undefined。
为什么f0.age值为undefined呢?
我个人理解是,Object.create接收的第一个参数是一个对象,所以当我传入通过new或字面量对象时都可以打印出值,但虽然函数也是对象,但是和通过new出来的对象还是有区别的,我的理解是当把函数当作对象使用时,如果想获取函数内的某个属性值时,是必须通过return进行返回的,无法直接访问,所以这里虽然f0.__proto__的原型指向了函数foo1,但是也无法直接访问foo1中的age(f0.age),当在函数对象中查找不到age值时,会往上级原型链上查找,函数的__proto__指向的是Function.prototype,所以f0.height的值为20
如:
var f = function foo() {
this.age = 10;
};
console.log(f.age); //undefined