• this指向和new关键字


    this指向

    1. 默认绑定
    function girl1() {
      console.log(this) // window
    }
    girl1()

    2. 隐式绑定

    var girl2 = {
      name: '小红',
      age: 18,
      detail: function () {
        console.log(this) // 指向 girl2 对象
        console.log('姓名: ', this.name)
        console.log('年级: ', this.age)
      }
    }
    girl2.detail()

    3. 硬绑定

    var girlName = {
      name: '小红',
      sanName: function () {
        console.log(this) // 指向 call,apply 的对象
        console.log('我的女孩:', this.name)
      }
    }
    var girl3 = {
      name: '小白'
    }
    var girl4 = {
      name: '小黄'
    }
    girlName.sanName.call(girl3)
    girlName.sanName.call(girl4)

    4. 构造函数绑定

    function Lover(name) {
      this.name = name
      this.sayName = function () {
        console.log(this) // 指向调用构造函数生成的实例
        console.log('我的女孩:', this.name)
      }
    }
    var name = '小白'
    var xiaoHong = new Lover('小红')
    xiaoHong.sayName()
    例题1:
    function a() {
      function b() {
        console.log(this) // window
        function c() {
          'use strict'
          console.log(this) // undefined
        }
        c()
      }
      b()
    }
    a()

    例题2:

    var name = '小白'
    function special() {
      console.log('姓名: ', this.name)
    }
    var girl = {
      name: '小红',
      detail: function () {
        console.log('姓名: ', this.name)
      },
      woman: {
        name: '小黄',
        detail: function () {
          console.log('姓名: ', this.name)
        }
      },
      special: special
    }
    girl.detail() // 小红
    girl.woman.detail() // 小黄
    girl.special() // 小红

    例题3:

    var name = '小红'
    function a() {
      var name = '小白'
      console.log('姓名: ', this.name)
    }
    function d(i) {
      return i()
    }
    var b = {
      name: '小黄',
      detail: function () {
        console.log('姓名: ', this.name)
      },
      bibi: function () {
        return function () {
          console.log('姓名: ', this.name)
        }
      }
    }
    
    var c = b.detail // 此时变量 c 和 b.detail ,没什么关系了
    b.a = a
    var e = b.bibi()
    a() // 全局调用,发生默认绑定 =》 小红
    c() // 隐式绑定  小红
    b.a() // 小黄 动作被用到 b 里面
    d(b.detail) // 小红 调用 d
    e() // 小红

    new 一个对象的过程

    function Father(firstName) {
      this.firstName = firstName
    }
    var son = Father('李')
     
    1. 创建一个新对象`son`
    2. 新对象会被执行`[[prototype]]`连接: `son.__proto__ = Father.prototype`
    3. 新对象和函数调用的`this`会绑定起来: `Father.call(son, '李')`
    4. 执行构造函数中的代码:`this.firstName = firstName`
    5. 如果函数没有返回值,那么就会自动返回这个新对象。 `return this`
     
  • 相关阅读:
    c#正则表达式应用实例
    C# 中堆栈,堆,值类型,引用类型的理解 (摘抄)
    c#用正则表达式获得指定开始和结束字符串中间的一段文本
    asp.net c#截取指定字符串函数
    <收藏>提高Web性能的14条法则(详细版)
    利用Anthem.net 实现前台javascript调用服务器端c#函数 及流程分析
    Anthem.net
    jQuery animate(滑块滑动)
    .NET使用母版页后,控件名称自动生成导致js无法正常操作.net控件的问题
    Cocos2dx跨平台Android环境配置
  • 原文地址:https://www.cnblogs.com/houfee/p/14281913.html
Copyright © 2020-2023  润新知