js-关于原型

90 阅读2分钟
  • 使用原型来实现继承

  • Obejct.create()Obejct.create() 可以改变对象的原型

  • 原型和对象有相同方法优先使用对象的方法

  • 函数的原型

    • prototype
      • 调用构造函数时赋予给对象的原型
    • proto
      • 函数本身的原型
  • ObjectObject 对象的 protoproto 只服务本身,而 prorotypeprorotype 对象服务于其他的实例

  • 通过原型可以找到对象,通过对象可以找到原型 ,使用constructor可以创建其他对象

  • 原型链

    • 检测原型链 instanceofinstanceof (判断构造函数)isPrototypeofisPrototypeof (判断对象)
    • inin 从自己到原型上查找 hasOwnPrototypehasOwnPrototype 只查找自己
  • 借用原型

    • apply,call
  • 创建原型

    • Obeject.create()Obeject.create() 创建原型后无法获取,浏览器产商设置使用--protoproto-- 来设置或者获取原型
    • 现在推荐使用 setPrototypesetPrototypegetPrototypegetPrototype 来设置或者获取原型
    • --protoproto-- 本质上是一个 get 和set ,在设置时只能添加对象,否则会被拦截,如果实在要设置,则将对象的原型置为 nullnull
  • --protoproto--

    • 继承是原型的继承,而不是改变构造函数

      Object.prototype.__proto__ = Object.prototype
      
    • 使用Object.prototype.protoObject.prototype.--proto-- 表示直接改变原型的指向

    • 使用Object.create(Object.prototype)Object.create(Object.prototype) 表示创建一个空对象,这个空对象的原型是Object.prototypeObject.prototype ,并且这个空对象将成为被赋予的原型

      • 这样改变原型后将失去本身的构造函数comstructorcomstructor ,因此需要再额外设置构造函数

        Object.protoype.controctor = object
        
      • 如果像上面设置构造函数,那么构造函数可以被遍历出来,但实际上我们不想要这个属性被遍历,因此可以这样设置

        Object.defineprototype(A.prototypt,"constructor",{
        	value: A,
        	enumerable: false
        })
        
    • jsjs 不支持多重继承,为了实现多重继承的功能,可以将需要的添加的方法写成一个对象,将这个对象添加到原型中

      const Address = {
      	getAddress(){
      		console.log('获取地址')
      	}
      }
      
      obj.prototype = Object.assign(obj.prototype,Address)
      
    • supersuper 访问当前对象的原型_(proto--proto--)_

      const Credit = {
      	__proto__: Request,
      	total(){
      		console.log(super.ajax+'积分统计');//super指的是Request的原型
      	}
      }