原型和原型对象你必须知道的点

157 阅读2分钟

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

每个构造函数都有一个原型对象

原型对象都包含一个指向构造函数的指针

实例都包含一个指向原型对象的内部指针

每个构造函数都有一个原型对象

  function Person(name, age, gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
   console.log(Person.prototype)

在这里插入图片描述

结果: 每个构造函数本身都是一个对象,它有一个属性叫做prototype,它是一个对象

原型对象都包含一个指向构造函数的指针

在这里插入图片描述

这个指针(属性)叫做constructor 指向构造函数本身

实例都包含一个指向原型对象的内部指针

  function Person(name, age, gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
    var person = new Person("小明","7",'4')
    console.log(person)

结果: 在这里插入图片描述

这个指向原型对象的内部指针叫做__proto__

 function Person(name, age, gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
    var person = new Person("小明","7",'4')
    console.log(person.__proto__===Person.prototype) //true

通过原型可以实现继承

当查找一个对象的属性时,JavaScript 会向上遍历原型链,直到找到给定名称的属性为止,到查找到达原型链的顶部(也就是 Object.prototype),如果仍然没有找到指定的属性,就会返回 undefined。

	function Person(name, age, gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
    Person.prototype.x = "10"
    Object.n = "20"
    var person = new Person("小明","7",'4')
    console.log(person.x) //10
    console.log(person.n) //20
    console.log(person.m) //undefined

总结

原型:
所有的函数都有一个特殊的属性prototype(原型),prototype属性是一个指针,指向的是一个对象(原型对象),原型对象中的方法和属性都可以被函数的实例所共享。所谓的函数实例是指以函数作为构造函数创建的对象,这些对象实例都可以共享构造函数的原型的方法。
原型链:
原型链是用于查找引用类型(对象)的属性,查找属性会沿着原型链依次进行,如果找到该属性会停止搜索并做相应的操作,否则将会沿着原型链依次查找直到结尾。常见的应用是用在创建对象和继承中。

原型和原型链 四个规则
1.可自由扩展属性
2.都有隐式原型_proto_,是一个普通的对象
3.隐式_proto_指向它的显式原型prototype
4.如果当前对象某个属性没有该值时,会自动下探到_proto_中的prototype中查找 最终为null