JavaScript核心(晋级高手必读篇)

来源:互联网 发布:sql面试必会6题经典 编辑:程序博客网 时间:2024/05/16 11:16

JavaScript核心(晋级高手必读篇) :

对象(Object) :

说明 :

  • Object 是一个属性的集合,并且都拥有一个单独的原型对象[prototype object]. 这个原型对象[prototype object]可以是一个 object 或者 null 值.

JavaScript 实例 :

var foo = {    x: 10,    y: 20,    showPos : function(){        console.log(this.x + "|" + this.y);    }};console.log(foo);console.log(foo.__proto__);console.log(foo.__proto__.__proto__);

输出结果 :

这里写图片描述

总结 :

这里写图片描述

foo.__proto__ 
  • 这个属性是用来存储该对象的原型 , foo 的原型是 Object {} , Object {} 的原型是 null .
  • 原型链的终点就是 null.

原型链(Prototype chain):

说明 :

  • 原型对象也是普通的对象,并且也有可能有自己的原型,如果一个原型对象的原型不为null的话,我们就称之为原型链(prototype chain).
  • 原型链是一个由对象组成的有限对象链由于实现继承和共享属性.

适用情况 :

假设,2个对象,大部分内容都一样,只有一小部分不一样,很明显,在一个好的设计模式中,我们需要重用那部分相同的,而不是在每个对象中重复定义那些相同的方法或者属性。在基于类[class-based]的系统中,这些重用部分被称为类的继承 – 相同的部分放入class A,然后class B 和 class C 从 A 继承.

ECMAScript没有类的概念。但是,重用[reuse]这个理念没什么不同(某些方面,甚至比class-更加灵活),可以由prototype chain原型链来实现. 或者通俗一些,叫做原型继承.

JavaScript 实例 :

var a = {    x: 10,    calculate: function () {        console.log(this.x + this.y);    }};var b = {    y: 20,    __proto__: a};var c = {    y: 30,    __proto__: a};// 调用继承过来的方法b.calculate(); // 30c.calculate(); // 40

输出结果 :

这里写图片描述

总结 :

b 和 c 的 _proto_属性设置为 a , b 和 c 可以使用 a 中定义的 calculate 方法,这就是有原型链来[prototype chain]实现的.

原理 :

在对象 b 中找不到 calculate 方法, 那么就会沿着原型链开始找。如果这个calculate方法在b的原型(prototype)中没有找到,那么就会沿着原型链找到 a 的原型(prototype),一直遍历完整个原型链。一旦找到,就返回第一个找到的属性或者方法。因此,第一个找到的属性成为继承属性。如果遍历完整个原型链,仍然没有找到,那么就会返回undefined。

注意 :

this这个值在一个继承机制中,仍然是指向它原本属于的对象
如果一个对象的prototype没有显示的声明过或定义过,那么_prototype_的默认值就是object.prototype, 而object.prototype也会有一个_prototype_, 这个就是原型链的终点了,被设置为null。

这里写图片描述

1 0
原创粉丝点击