[JavaScript] (Day-09) - 方法

作者: 已重置2020 | 来源:发表于2017-06-27 20:20 被阅读10次
    Absence sharpens love, presence strengthens it. 相聚爱益切,离别情更深。

    在一个对象中绑定函数,称为这个对象的方法


    定义

    原始的对象表示

    var Person = {
        name: "Eric",
        birth: 1990
    };
    

    但是,如果我们给Person绑定一个函数,就可以做更多的事情。比如,写个age()方法,返回Person的年龄

    var Person = {
        name: "Eric",
        birth: 1990,
        age: function () {
            var y = new Date().getFullYear();
            return y - this.birth;
        }
    };
    
    Person.age;     // function Person.age()
    Person.age();   // 今年调用是27,明年调用就变成27了
    
    
    Person对象中获取age 的函数就是对象 Person 的方法

    关键词 this

    在一个方法内部,this是一个特殊变量,它始终指向当前对象,也就是Person这个变量。所以,this.birth可以拿到Personbirth属性。

    function getAge() {
        var y = new Date().getFullYear();
        return y - this.birth; // this 表示该函数的调用者
    }
    
    var Person = {
        name: "Eric",
        birth: 1990,
        age: getAge
    };
    
    Person.age(); // 27, 正常结果
    getAge(); // NaN
    

    当方法内部调用方法的时候,使用this就有问题了
    var Person = {
        name: "Eric",
        birth: 1990,
        age: function () {
            
            function getAgeFromBirth() {
                var y = new Date().getFullYear();
                return y - this.birth;
            }
            return getAgeFromBirth();
        }
    };
    
    // 此时就会报错,因为当前的 `this` 指向 `undefined`
    Person.age();   // Uncaught TypeError: Cannot read property 'birth' of undefined
    
    

    上面的报错是因为在方法内部调用 thisthis 指向的为空

    解决方法: 用一个that变量首先捕获this
    var Person = {
        name: "Eric",
        birth: 1990,
        age: function () {
            var that = this; // 在方法内部一开始就捕获this
            function getAgeFromBirth() {
                var y = new Date().getFullYear();
                return y - that.birth;
            }
            return getAgeFromBirth();
        }
    };
    
    // 此时就会报错,因为当前的 `this` 指向 `undefined`
    Person.age(); // 27
    

    var that = this; 后,将最外层的 对象 保存起来,供内部函数调用


    方法 apply

    虽然this在嵌套函数中会指向 undefined, 但是this的指向是可以控制的

    用函数本身的apply方法,指定函数的this指向哪个对象,第一个参数就是需要绑定的this变量,第二个参数是Array,表示函数本身的参数。

    function getAge() {
        var y = new Date().getFullYear();
        return y - this.birth; // this 表示该函数的调用者
    }
    
    var Person = {
        name: "小明",
        birth: 1990,
        age: getAge
    };
    
    Person.age(); // 27, 正常结果
    getAge.apply(Person, []); // 27, this指向Person, 参数为空
    
    

    相关文章

      网友评论

        本文标题:[JavaScript] (Day-09) - 方法

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