什么是原型
在 JavaScript 中,每个对象都有一个原型(prototype)。原型是一个对象,拥有属性和方法,可以通过原型继承属性和方法,能够实现内存共享和对象之间的属性和方法的共享。
原型的作用!important(很重要那种!!)
1.内存共享
2.实现数据共享
prototype
1.任何函数(除null)都有prototype属性,它本身就是一个对象
例如:
function fn(){}
console.log(fn.prototype);
(注意:这是用花括号括起来的,它本身是一个对象)
2.构造函数也有prototype属性,我们称之为原型
例如:
function Person(name,age) {
this.name = name;
this.age = age;
}
console.log(Person.prototype);
(注意:这也是用花括号括起来的,它本身也是一个对象)
constructor
1.任何对象都有constructor属性,实例化对象的constructor属性指向构造函数
function Person(name,age) {
this.name = name;
this.age = age;
}
// 实例化对象
let zs = new Person('张三',21);
console.log(zs);
console.log(zs.constructor);
console.log(zs.constructor == Person); // 这里可以证明
__proto__
1.任何对象都有__proto__属性,他是一个指针,实例化对象的__proto__属性指向构造函数的原型
function Person(name,age) {
this.name = name;
this.age = age;
}
// 实例化对象
let zs = new Person('张三',21);
console.log(zs);
console.log(zs.__proto__);
console.log(zs.__proto__ == Person.prototype);
原型链最终指向
原型链的查找规则
从本身到原型依次往下查找,如果有则返回
先从本身上面找,如果找到直接返回
function Person(name,age) {
this.name = name;
this.age = age;
}
Person.prototype.name = '李四'
let zs = new Person('张三',21);
console.log(zs.name); // 张三
没找到则从原型上依次寻找
function Person(name,age) {
// this.name = name;
this.age = age;
}
Person.prototype.name = '李四'
let zs = new Person('张三',21);
console.log(zs.name); // 李四
没有找到则返回undefined
function Person(name,age) {
this.age = age;
}
let zs = new Person('张三',21);
console.log(zs.name); // 这里是没有则返回Undefined