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())
  • 相关阅读:
    使用带Arduino IDE & WIZ820io的ATmega1284P
    初学者使用IntellJ IDEA建立Struts2项目
    树状数组
    hdu 4605-Magic Ball Game(树状数组)
    hdu1547之BFS
    面向服务的体系结构(SOA)——(3)关于BPM
    电信运营商移动互联网发展分析
    共享IP云主机(VPS)玩转wdcp
    从 Windows 到 Android: 威胁的持续迁移
    java 存储oracle的clob字段
  • 原文地址:https://www.cnblogs.com/ssw-men/p/10862277.html
Copyright © 2011-2022 走看看