这是我参与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