美文网首页
原型、this指向

原型、this指向

作者: 糕糕AA | 来源:发表于2019-06-27 14:11 被阅读0次
  • 原型

    【构造函数】 首字母大写,他里面定义了各种需要共享的属性和方法。构造函数里面有prototype属性,是个指针,指向他的【原型对象】,原型对象中有个construction属性,默认指回构造函数。可以向原型对象中写入属性和方法
    当new一个【实例对象】时,构造函数中的this指向这个实例对象,实例对象中有个[[Prototype]],指向构造函数的原型对象,可以通过浏览器提供的__proto__来访问到。

继承:根据proto一级一级的向上查找,找到了父辈和爷爷辈的属性

  • 构造函数通过 构造函数.prototype ,来定义原型对象(向其中写入属性和方法),达到共享数据、节省内存的目的
  • 原型对象中有 constructor 构造器,指向他的构造函数
  • 通过 new 构造函数,可以创建一个实例对象,这个实例对象继承了构造函数中的所有属性和方法,同时,可以通过浏览器属性proto,来访问原型对象中的属性和方法
  • 当输出实例对象中的属性或方法时,会首先输出对应的构造函数中的对应属性或方法,如果找不到,则通过proto也就是原型链,向上寻找其构造函数中对应的属性或方法,一级一级逐层向上,直到找到为止。
  • 一切的原型链都会最终指向 Object.prototype ,而 Object.prototype 的proto为null。

new 一个对象的过程: var obj = new Foo()

  1. 创建了一个新的空对象 {}
  2. 将构造函数的作用域赋给新对象(this就指向新对象)执行构造函数的代码(为对象添加属性)
  3. 设置原型链,将obj的proto指向了 Foo 函数对象的 prototype 原型对象
  4. 返回新对象 obj

工厂模式:函数名小写,函数内部new Object(),有返回对象return X,直接调用函数可以创建

属性遮蔽:实例会现在自身查找有没有对应的属性或者方法,如果没有,就去proto上面去找,如果还没有,就继续在proto.proto去找,一直到为null,停止搜索。这种情况称为"属性遮蔽 (property shadowing)。

弊端:如果在当前实例没有的属性和方法,js就会遍历原型链上所有的属性和方法,这样很耗费性能。所以请注意代码中原型链的长度,并在必要时将其分解,以避免可能的性能问题

不要试图修改或扩展原生对象的原型:尽量不要去修改类似Object.prototype,你可能会覆盖原型属性或方法,也可能对继承自Object的实例发生不可预知的bug**

  • this 指向问题

function foo(){}

var obj = {}

  • 默认绑定:function中的this,如果直接执行,那么指向的是全局对象-window
  • 隐式绑定:整个调用链上,处于方法上一层的对象,如 obj.foo(),this指的是obj对象
  • 显示绑定:call和apply bind的参数形式类似于call,但是返回的是显式绑定后的函数对象,需要后续去调用执行。 bind常用于柯里化一个函数对象。 如:foo.call(obj),this指向obj。(显式绑定中,如果对this不敏感,可以传入null,但是可能有副作用。 更安全的做法是,传入一个空对象,即var empty = Object.create(null),它连指向Object.prototype的proto都没有,比{}更空。)
  • new绑定:var obj = new foo(),this指向obj这个实例对象
  • ⚠️箭头函数没有this绑定,箭头函数会继承外层函数调用的 this 绑定(无论 this 绑定到什么)

优先级

  • new在调用构造函数的时候做初始绑定。
  • 显式绑定或硬绑定优先级最高。
  • 没有显式绑定,就使用隐式绑定。
  • 如果都没有,就使用默认绑定(undefined,是不是全局看严格模式)。

相关文章

  • javascript高级-02

    一、原型及原型链 二、原型的指向是可以改变的 原型最终指向了哪里? 三、函数中的this的指向

  • 原型、this指向

    原型【构造函数】 首字母大写,他里面定义了各种需要共享的属性和方法。构造函数里面有prototype属性,是个指针...

  • 原型和原型链

    原型 所有函数都有一个prototype属性,指向一个原型对象;原型对象有一个constructor属性,指向这个...

  • JavaScript中的prototype, construct

    定义 prototype是函数(构造函数)的属性,指向原型对象。 constructor是原型对象的属性,指向当前...

  • 构造函数,原型,实例之间的关系

    关系: 1、每个构造函数都有一个原型属性prototype,它指向原型对象2、原型对象都包含一个指向构造函数的指针...

  • js几种继承方式

    注意: 1,constructor总是指向类的构造函数 2,__proto__指向父类的原型对象 1,原型链继承 ...

  • 原型与原型链

    原型 每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。...

  • 【JS第27期】继承-原型链

    每个构造函数都有一个原型对象,原型对象都包含一个指向函数的指针,而实例都包含一个指向原型对象的内部指针。此时的原型...

  • _proto_与prototype区别

    proto是对象的属性,指向该对象的构造函数的原型对象 prototype是函数属性,指向该方法的原型对象

  • 原型链

    原型链函数的原型对象prototype函数都有prototype属性指向函数的原型对象【只有函数根除外】原型对象的...

网友评论

      本文标题:原型、this指向

      本文链接:https://www.haomeiwen.com/subject/tsfrcctx.html