JavaScrip原型对象1

101 1753

概念

核心概念

原型是一个对象, 在函数创建的时候生成, 使用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);

包含引用值的原型属性共享问题

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

[[一些操作原型对象的方法]]


Prev Post JavaScrip内存优化的方法
Next Post JavaScrip原型链继承详解