构造函数创建实例
let Person = function() {
}
Person.prototype.name = 'Person'
let person = new Person()
console.log(person.name) // Person
每个函数都有一个prototype属性,而这个属性是个对象,是通过这个构造函数创建的实例的原型对象。
let Person = function() {
}
Person.prototype.name = 'Person'
let person = new Person()
person.name = '小麦'
console.log(person.name) // 小麦
delete person.name
console.log(person.name) // Person
每个javascript对象(除了null)都有一个__proto__指向其构造函数的原型对象,即person.__proto__ === Person.prototype。
person.__proto__ === Person.prototype // true
__proto__来自于Object.prototype,与其说是一个属性,不如说是getter/setter。当使用 person.__proto__ 时,可以理解成返回了 Object.getPrototypeOf(person)。
Object.getPrototypeOf(person) === Person.prototype // true
当在实例上找不到属性或方法时会往它的原型对象上找,再找不到,会从原型对象的原型对象上找,直到找到为止,或找到尽头null,找不到则返回undefined。
构造函数的prototype对象的constructor指向了构造函数,即Person === Person.prototype.constructor。
Person === Person.prototype.constructor // true
person.constructor === Person //true
person本身没有constructor属性,但是它可以通过实例原型查找,Person.prototype里有指向构造函数的constructor,所以实例可以通过原型找到构造函数。