JavaScrip原型对象1
概念
核心概念
原型是一个对象, 在函数创建的时候生成, 使用prototype可以给这个原型赋值
// 构造函数
function Person(){}
// 原型对象添加属性方法
Person.prototype.name = "Jc"
Person.prototype.sayName = function(){
console.log(this.name);
}
// 创建实例
let p1 = new Person();
let p2 = new Person();
console.log(p1.sayName==p2.sayName);
可简单用如下图表示
构造函数prototype属性-------->原型对象
↑ ↑ constructor属性
↑ ↑ ↓ [[prototype]] --->obj
-------------------
↑
其他原型对象实例prototype属性
constructor属性
随函数所生成的原型对象, 会有一个属性constructor指回生成该对象的构造函数

proto属性
实例所对应的原型对象可以通过_proto__属性访问
原型搜索
属性首先会在实例上找, 依次按照原型链往上查, 查到就返回
遮蔽
实例上的属性和原型上的属性重复, 则使用实例上的属性, 也叫遮蔽

原型动态性和原型重写
当实例先创建, 后来又修改了实例中的属性, 则实例中也会立刻反映出来.
// 构造函数
function Person(){}
// 创建实例
let p1 = new Person();
Person.prototype.name = "cat";
console.log(p1.name);
但是原型重写不会, 原型重写后之前的实例仍然指向之前的旧原型, 只有新创建的实例才可
原型重写是指以字面量的形式给prototype赋值
// 构造函数
function Person(){}
// 创建实例
let p1 = new Person();
Person.prototype.name = "cat";
console.log(p1.name);
// 重写原型
Person.prototype = {
name: "dog"
}
// 不会反映到重写前创建的实例上
console.log(p1.name);

包含引用值的原型属性共享问题
原型最大的问题是其共享性, 当然可以通过给实例上添加同名属性进行遮盖处理, 但仍然无法掩盖原型上的属性在所有实例之间的共享, 比如不需要共享属性