【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

你可能感兴趣的:(javascript,前端,oop,继承,原型链)