乐趣区

关于javascript:js-中需要特别注意的地方记录下篇-js原型链和继承的理解

  • Object() Function() Array() 等等都为构造函数。
  • Js 面向对象与传统 oop 有些不同,语法较高级 语法糖封装。
  • This 为指针。指向 this 作用域的调用者

原型

  1. 原型继承链顶端为 Object。Js 函数是对象
  2. 当读取对象中的属性时,先去实例自身中搜寻,如搜寻不到则去指向的原型中搜寻
  3. .prototype 是一个对象。外面有一个结构器属性 constructor。实例中也有一个结构器属性。只有函数有 prototype 对象和__proto__指针。结构进去的实例只有__proto__ 指针

原型链

1. 原型的存在意义在于实现继承共享,是在构造函数中定义的一个成员对象,在下次实例化时不须要在构造函数中定义成员 就可实现实例共享方法属性。

例子 1:

通常为。构造函数.prototype.xxx= 我想实现实例继承的货色 -》new 构造函数 -》新实例 a 对象. 原型指针指向构造函数的 xxx 对象(援用类型)

例子 2:

Array 不等于 Array()起因 Array 为一个函数,而 Array()为一个结构函数调用语句,故 Array 领有 prototype 对象用于实例的共享继承,Array()产生一个实例 故只能领有 prototype 对象的公有指针 proto

2. 在应用原型继承时 不能应用字面量 构造函数.prototype={} 的形式重写原型对象。因为会导致该原型对象的 constructor 属性被重写,在生成的实例中导致 constructor 指向 Object 并且会切断之前原型对象的分割,毁坏原型链。

3.JavaScript 次要通过原型链实现继承。原型链的构建是通过将一个类型的实例赋值给另一个构造函数的原型实现的

例子 3:

xxx 实例.__proto__-》function xxx()构造函数.prototype 对象故 xxx.__proto__ === xxx.prototype

xxx.prototype.__proto__-》Object.prototype 因为所有对象都为 Object 函数结构来的。故 xxx.prototype.__proto__===Object.prototype。

Object.prototype.__proto__为原型链顶端__proto__定义了尚未应用所以为 null 故 Object.prototype.__proto__===null 约定俗成。

  • instanceof 用来判断某实例是否为某构造函数的实例
  • isPrototypeOf 用于判断某实例是否领有某构造函数的原型对象指针

继承

1. 原型模式有疏忽构造函数定义初始值步骤及原型中操作援用类型的毛病。所以须要组合应用 构造函数模式 + 原型模式 来创立实例。在构造函数中定义实例的属性,而需共享的办法就定义在原型对象中。

继承:在子构造函数中调用 父.call(this, name); 实现构造函数之间的属性继承。应用 子.prototype = new 父(); 子.prototype.constructor = 子; 实现办法的继承。

2. 如要在生产环境下的构造函数新增办法(如 Array)须要应用一个相似于工厂函数的寄生构造函数模式 在构造函数中返回一个批改后的对象

例子:在子类中应用 call()能够实现继承
function SuperType(name){this.name = name;} 
function SubType(){// 继承了 SuperType,同时还传递了参数 SuperType.call(this, "Nicholas"); 
SuperType.call(this, "Nicholas"); 
// 实例属性 
    this.age = 29;
}
var instance = new SubType();
alert(instance.name);    //"Nicholas";
alert(instance.age);     //29
退出移动版