构造函数,原型对象,实例对象

159 阅读2分钟

在这里我们先来说一下,什么是构造函数

就是用new关键字调用的函数,被称为构造函数

function Person(name, age, gender) {
    this.name = name,
    this.age = age,
    this.gender = gender,
}
let obj = new Person('张三', 18, '女')
console.log(obj) // Person {name: '张三', age: 18, gender: '女'}

在这里我们可以看出,构造函数的返回值是一个对象,但是函数内部并没有写return,这是因为new关键字起到的四个作用,在这个函数内部,(1)new创建了一个空对象,(2)并且this指向这个对象,(3)然后给这个空对象赋值,(4)return返回这个对象。 这个对象,就是属于Person的实例对象

另外,如果在这个函数内部,手动添加return,如果是值类型的数据,最后的结果还是返回new创建的对象;如果是引用类型,就会覆盖掉new创建的对象。

原型对象:每一个函数在创建的时候,系统都会自动创建一个对应的对象,称之为原型。它的作用是:解决内存浪费变量污染,这个和数据的存储有关。

//(1)构造函数
function Person(name,age){
    this.name = name
    this.age = age
}

//(2)原型对象
Person.prototype.eat = function(){
    console.log('吃东西')
}

//(3)实例对象
let p1 = new Person('阿德',20)

console.log( p1 ) // Person {name: '阿德', age: 20}
/* 
__proto__ : 属于实例对象,指向原型对象
    作用: 可以让实例对象,访问原型对象中所有的成员
    注意点: __proto__不是ECMA标准属性,实际开发中不能写的,一定要省略。
    只可以在学习的阶段使用,为了加深理解
*/
p1.eat()// 吃东西    p1.__proto__.eat()
console.log( p1.__proto__ === Person.prototype ) // true
console.log( p1.__proto__.constructor )//Person
console.log( p1.constructor )//p1.__proto__.constructor

构造函数、原型对象、实例对象 三者关系:prototype : 属于构造函数,指向原型对象; __proto__ : 属于实例对象,指向原型对象;constructor : 属于原型对象,指向构造函数