Java中有运行时类型识别,js可以很方便的模仿这个特性,因为所有js对象都有一个属性constructor(构造器),表示这个对象的构造方法,原型与构造方法同名,所以可以通过这儿知道任意对象的原型名称。具体可以看代码(这里简单的封装了):
function runToChain(obj){
var chainName=obj.constructor.name;
console.log(chainName);
return chainName;
}
自定义的fn函数(非匿名函数即构造函数),会按照一定的规则生成prototype属性,这个属性指向其原型。生成的实例对象会生成指针指向fn.prototype(实际完全可以等同看作指向其原型,原型只可以通过fn.prototype形式进行表示),所以原型链可以简单地看作实例指向原型。fn()为自定义的构造函数,产生时即产生原型。通过fn.prototype即可改造原型,例:fn.prototype.name="",即为原型添加了一个name属性。
当fn.prototype=new someObj()时,可以理解成new someObj()将指向其原型someObj的指针复制给了原型fn.prototype,所以fn.prototype的实例可以访问someObj构造函数中的属性及方法(原型的属性和方法即构造函数中的属性及方法),实现继承。以此逻辑递推,原型链被延伸。