JS实例化过程总结(附原型链图解)

没有返回值的构造函数形式

function Person(name,age){
    this.name = name;
    this.age = age;
    this.show = function(){
        console.log('每个人的身上都有毛毛');
    }
}


var person = new Person('LiMing',22);
console.log(person);
person.show();//如果不调用,不会输出
console.log(person instanceof Person);
console.log(person.__proto__ == Person.prototype);

运行结果如下:

 如果实例没有调用方法,图中圈出的部分不能被输出;

根据图中显示结果,我们可以得出以下结果:

1.创建了一个object对象{};
2.将构造函数的静态属性传递给创造的对象;
3.实例对象额外添加了__proto__属性,指向了构造函数的prototype属性,也就是原型对象;
4.构造函数的原型对象有一个constructor方法,返回值为构造函数;
5.构造函数内的this指向为实例对象;
另外:如果实例没有调用构造函数的方法,不会输出图中画框的部分;

如果有返回值的情况1:返回值为基本数据类型

function Person1(name,age){
    this.name = name;
    this.age = age;
    this.show = function(){
        console.log('每个人的身上都有毛毛');
    };
    return 22
}


var person1 = new Person1('LiMing',22);
console.log(person1);
person1.show();
console.log(person1 instanceof Person1);
console.log(person1.__proto__ == Person1.prototype);

 从结果看,基本的数据类型不影响实例过程;

如果有返回值的情况2:返回值为引用数据类型

var person2 = new Person2('LiMing',22);
console.log(person2);
person2.show();
console.log(person2 instanceof Person2);
console.log(person2.__proto__ == Person2.prototype);


function Person3(name,age){
    this.name = name;
    this.age = age;
    this.show = function(){
        console.log('每个人的身上都有毛毛');
    };
    return {
        weight:70,
        height:185,
        show:function () {
            console.log('你是我天边最美的云彩!')
        }
    }
}


var person3 = new Person3('LiMing',22);
console.log(person3);
person3.show();
console.log(person3 instanceof Person3);
console.log(person3.__proto__ == Person3.prototype);

function Person4(name,age){
    this.name = name;
    this.age = age;
    this.show = function(){
        console.log('每个人的身上都有毛毛');
    };
    return [12,23,'345',{name:'LiHua'}]
    
}


var person4 = new Person4('LiMing',22);
console.log(person4);
person4.show();
console.log(person4 instanceof Person4);
console.log(person4.__proto__ == Person4.prototype);

 从结果看,如果构造函数返回一个object的话,实例为返回的对象;

最后,附上一张本人觉得比较好的原型链图解

其中中间颜色加深部分,分为三种构造器,

1>自定义构造器;
2>对象构造器;
3>内置对象构造器(例如Array,String,Date,Match);

博观而约取
原文地址:https://www.cnblogs.com/EssMin/p/14629111.html