zoukankan      html  css  js  c++  java
  • JavaScript的元项链和new this关键字

    函数中的this关键字指代调用了函数的对象,如果不通过某个对象调用函数,那么this指向全局对象。

    new关键字和this关键字密切相关。new关键字创建一个空对象,然后使用指向这个对象的this调用函数,函数不会创建对象,只会修改this指向的对象,关键字new创建的对象(也就是this指向的对象)会返回给函数中的this,而被new调用的函数称为构造函数

    function makePerson(first, last) {
        return {
            first: first,
            last: last,
            fullName: function() {
                return this.first + ' ' + this.last;
            },
            fullNameReversed: function() {
                return this.last + ', ' + this.first;
            }
        }
    }
    s = makePerson("Simon", "Willison");
    s.fullName(); // Simon Willison
    s.fullNameReversed(); // Willison, Simon
    
    s = makePerson("Simon", "Willison");
    var fullName = s.fullName;
    fullName(); // undefined undefined,this指向全局对象,全局对象中没有定义first和last所以为undefined

    //当执行
    var o = new Foo()
    //javascript实际是执行
    var o = new Object()
    o.__proto__ = Foo.prototype
    Foo.call(o)

    原型链

            js只有一种结构是对象,每个对象都有一个私有属性(__proto__)指向其构造函数的原型对象(prototype)。该原型对象也有自己的原型对象(__proto__),
            层层向上知道一个对象的原型对象是null,null没有原型对象,所以null是原型链的终点。几乎所有js对象都是位于原型链顶端Object的实例。
            当访问一个对象的属性时,不仅会在当前对象上搜索,还会在原型链中搜索,知道找到名字匹配的属性,或到达原型链的末尾。
            当一个对象A调用其原型对象B的方法时,方法中的this指向的是对象A。
    var o = {a: 1};
    
    // o 这个对象继承了 Object.prototype 上面的所有属性
    // o 自身没有名为 hasOwnProperty 的属性
    // hasOwnProperty 是 Object.prototype 的属性
    // 因此 o 继承了 Object.prototype 的 hasOwnProperty
    // Object.prototype 的原型为 null
    // 原型链如下:
    // o ---> Object.prototype ---> null
    
    var a = ["yo", "whadup", "?"];
    
    // 数组都继承于 Array.prototype 
    // (Array.prototype 中包含 indexOf, forEach 等方法)
    // 原型链如下:
    // a ---> Array.prototype ---> Object.prototype ---> null
    
    function f(){
      return 2;
    }
    
    // 函数都继承于 Function.prototype
    // (Function.prototype 中包含 call, bind等方法)
    // 原型链如下:
    // f ---> Function.prototype ---> Object.prototype ---> null
    
     
    在原型链中查找属性是比较耗时的,访问某个不存在的属性会遍历整个原型链。
    检查对象是否有自己定义的某个属性要使用从Object.prototype中继承的hasOwnProperty()方法,hasOwnProperty是唯一一个处理属性不需要遍历原型链的方法(还有一个Object.keys())
  • 相关阅读:
    [HAOI2018]苹果树
    [TJOI2013]拯救小矮人
    [SDOI2016]硬币游戏
    一辈子都学不会的有上下界的网络流
    [AHOI2014/JSOI2014]支线剧情
    [JSOI2009]球队收益
    hdu-1856 More is better---带权并查集
    hdu-1325 Is It A Tree?---并查集
    hdu-1272 小希的迷宫---并查集或者DFS
    hdu1213-How Many Tables---基础并查集
  • 原文地址:https://www.cnblogs.com/ssw-men/p/10862277.html
Copyright © 2011-2022 走看看