本文力求用最短的语言总结这块地知识点
好的!开始!
(1) 原型对象
先看一段代码:
function Peroson(){
}
Person.prototype.name = 'Jack';
var person1 = new Person();
person1.name
var person2 = new Person();
person2.name
Person函数创建之后,默认会有 prototype 属性,这个属性指向函数的原型对象,即:Person.prototype
默认情况下,所有原型对象都会有一个 constructor (构造函数)属性,指向 prototype 属性所在函数的指针
即:Person.prototype.constructor ==> Person
原型对象中除了 constructor 属性,其他的方法,是从 Object 继承而来
当创建了一个新实例后,该实例内部将会有一个 proto 属性,仅仅指向构造函数的原型对象。即 Person.prototype
需要明确一点的是:实例的 proto 连接,存在于实例与构造函数的原型对象之间,而不是存在于实例与构造函数之间
确定实例是否是该函数的实例:
Perosn.prototype.isPrototypeOf(person1)
如果实例中属性和原型中属性同名,则实例中属性会屏蔽原型中属性,但是不会重写。
(2) 继承
原理:利用原型让一个引用类型继承另一个引用类型的属性和方法
具体做法:让原型对象等于需要继承的构造函数的一个实例
示例:
function SuperType(){
this.property = true;
}
SuperType.prototype.getSuperValue = function(){
return this.property;
}
function SubType(){
this.subproperty = false;
}
// 继承了 SuperType
SubType.prototype = new SuperType();
SubType.prototype.getSubValue = function(){
return this.subproperty;
}
var instance = new SubType();
instance.getSuperValue() // true
实现的本质是:重写原型对象,代之以一个新类型的实例
通过实现原型链,本质上扩展了原型搜索机制
确定原型和实例之间的关系
(1) instance instanceof Object
(2) SubType.prototype.isPrototypeOf(instance)