原型
每个函数都是一个对象,函数有一个prototype属性和__proto__属性
这个propotype就是我们所说的原型
function Person(){}
原型链
对象只有__proto__属性,对象与对象之间不是独立存在的
function Person(name) {
this.name = name;
}
// 在函数的原型上添加变量和方法
Person.prototype.name = "李四";
Person.prototype.say = function () {
console.log("你好");
}
let obj = new Person("张三");
console.log(obj.name); // 张三
obj.say(); // 你好
console.log(obj)
new关键词做了什么?
- 实例化了一个对象,这里就是实例化了obj这个对象
- 将this指向这个实例化对象 ps:this-> obj
- 将实例化对象的__proto__指向构造函数的原型对象上 ps: this.proto -> Person()
- 将属性和方法添加到实例化对象上 ps: this.name ,this.say()
- 返回this
这就可以解释为什么obj.say()可以打印
通过对象的属性__proto__函数的原型对象(函数名.prototype)一层一层网上找,知道找到Object.propotype为止,这个层层继承的链接结构就是原型链