JS通过Object.create创建对象内部原理分析研究

    xiaoxiao2022-07-04  170

    通过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
    最新回复(0)