JS--原型与原型链
一:原型的概念
只要创建了一个新函数,就会为该函数创建一个prototype属性,该属性指向函数的原型对象。所有的原型对象都会自动获得一个constructor属性,指向prototype属性所在的函数。调用构造函数创建一个实例后,在实例内部包含一个[[Prototype]]指针,指向构造函数的原型。 在脚本中没有标准的方式访问[[Prototype]],但Firefox、Safari、Chrome在每个对象上都支持一个属性__proto__。注意,这个连接存在于实例于构造函数的原型对象之间,不存在于实例与构造函数之间,即__proto__指向的是构造函数的原型,与构造函数没有直接的关系。
例如:
function Person(){ } Person.prototype.name = "Nicholas"; Person.prototype.age = 29; Person.prototype.job = "Software Engineer"; Person.prototype.sayName = function(){ alert(this.name); }; var person1 = new Person(); person1.sayName(); //"Nicholas" var person2 = new Person(); person2.sayName(); //"Nicholas" alert(person1.sayName == person2.sayName); //true
该段代码各个对象之间的关系如下:
二.原型链
所有引用类型默认继承了Object。
函数 ----> Function.prototype ----> Object.prototype
函数通过属性 __proto__ 指向Function.prototype
1.Object构造函数 是 通过 Function 构造函数 实例化出来的。
2.Function构造函数 也是 通过 Function 构造函数 实例化出来的,即Function 是自己的构造函数。
3.Object .__proto__指向Function.prototype。又有 Function.prototype 继承自 Object.prototype即Function.prototype.__proto__指向Object.prototype。
4.原型链最顶端的对象是Object.prototype。Object.prototype.__proto__=null
Function 是自己的构造函数,如图:
总结:
1.任何函数继承自Function.prototype
2.任何对象最终继承自 Object.prototype