理解javaScript原型、原型链

理解对象
首先对象的定义是:“无序属性的集合,其属性能够包含基本值、对象或者函数。”严格来说,
这就至关于说对象是一组没有特定顺序的值。对象的每一个属性或方法都有一个名字,而每一个名字都映射到一个值。正由于这样(以及其余将要讨论的缘由),咱们能够把 ECMAScript 的对象想象成散列表:无非就是一组名值对,其中值能够是数据或函数。
原型对象理解
1.建立的每一个函数都有一个 prototype(原型)属性,这个属性是一个指针,指向一个对象(原型对象), 而原型对象的用途是包含能够由特定类型的全部实例共享的属性和方法。函数

clipboard.png

clipboard.png
2.建立一个新函数,会根据一组特定的规则为该函数建立一个 prototype 属性(原型属性),这个属性指向函数的原型对象。在默认状况下,全部原型对象都会自动得到一个 constructor (构造函数属性)属性,这个属性包含一个指向 prototype 属性所在函数的指针。就拿前面的例子来讲, Person.prototype.constructor 指向 Person。而经过这个构造函数,咱们还可继续为原型对象添加其余属性和方法测试

clipboard.png

3.当调用构造函数建立一个新实例后,该实例的内部将包含一个指针(内部 属性),指向构造函数的原型对象。ECMA-262 第 5 版中管这个指针叫[[Prototype]]。虽然在脚本中 没有标准的方式访问[[Prototype]],但 Firefox、Safari 和 Chrome 在每一个对象上都支持一个属性 proto;而在其余实现中,这个属性对脚本则是彻底不可见的。不过,要明确的真正重要的一点就 是,这个链接存在于实例与构造函数的原型对象之间,而不是存在于实例与构造函数之间。Person 的每一个实例—— person1 和 person2 都包含一个内部属性,该属性仅仅指向了 Person.prototype;换句话说,它们 与构造函数没有直接的关系。spa

4.实现中都没法访问到[[Prototype]],.net

1>但能够经过 isPrototypeOf()方法来肯定对象之间是否存在这种关系。

clipboard.png

2>ECMAScript 5增长了一个新方法,叫Object.getPrototypeOf(),在全部支持的实现中,这个方法返回[[Prototype]]的值。例如:

clipboard.png

理解prototype、__proto__与constructorprototype

clipboard.png

1>__proto__和constructor属性是对象所独有的;prototype属性是函数所独有的,由于函数也是一种对象,因此函数也拥有__proto__和constructor属性。
2>__proto__属性的做用就是当访问一个对象的属性时,若是该对象内部不存在这个属性,那么就会去它的__proto__属性所指向的那个对象(父对象)里找,一直找,直到__proto__属性的终点**null**,而后返回undefined,再往上找就至关于在null上取值,会报错。经过__proto__属性将对象链接起来的这条链路即咱们所谓的**原型链**。
3>prototype属性的做用就是让该函数所**实例化的对象**们均可以找到公用的属性和方法,即f1.__proto__ === Foo.prototype。
4>constructor属性的含义就是指向该**对象的构造函数**,全部函数(此时当作对象了)最终的构造函数都指向Function。

原型链
原型链是实现继承的主要方法。其基本思想是利用原型一个引用类型继承另外一个引用类型的属性和方法
(构造函数)的prototype属性指向(原型对象);
(原型对象)的constructor属性指向(构造函数);
(实例对象)的[[Prototype]]/__proto__指向(原型对象)指针

clipboard.png

clipboard.png
1.全部引用类型默认都继承了 Object,而 这个继承也是经过原型链实现的。你们要记住,全部函数的默认原型都是 Object 的实例,所以默认原 型都会包含一个内部指针,指向 Object.prototype。这也正是全部自定义类型都会继承 toString()、 valueOf()等默认方法的根本缘由。因此,咱们说上面例子展现的原型链中还应该包括另一个继承层次code

clipboard.png

  1. 肯定原型和实例的关系

能够经过两种方式来肯定原型和实例之间的关系。第一种方式是使用 instanceof 操做符,只要用 这个操做符来测试实例与原型链中出现过的构造函数,结果就会返回 true。如下几行代码就说明了这 一点。对象

clipboard.png
因为原型链的关系,咱们能够说 instance 是 Object、SuperType 或 SubType 中任何一个类型 的实例。所以,测试这三个构造函数的结果都返回了 true。
第二种方式是使用 isPrototypeOf()方法。一样,只要是原型链中出现过的原型,均可以说是该 原型链所派生的实例的原型,所以 isPrototypeOf()方法也会返回 true,以下所示。blog

clipboard.png

参考文章继承

相关文章
相关标签/搜索