调用构造函数|为什么"这个"关键字返回undefined?

时间:2015-11-18 21:22:52

标签: javascript javascript-objects

我正在玩物体和建造者,我很好奇为什么我不能执行:人(5,10)。参数传递给人员函数,但随后变量赋值消失,我得到"不能设置属性" age"未定义"铬中的错误。

"use strict"

function person(age, height){
this.age = age;
this.height = height;
this.calculate = function(){
     var newHeight = this.height * 2;
     console.log(newHeight);
    }
}
person(5,10);

2 个答案:

答案 0 :(得分:0)

  

我得到"无法设置属性"年龄"未定义" chrome中的错误。

当您在strict mode中呼叫某个功能时,thisundefined。看来你想用new

来调用函数作为构造函数
new person(5, 10)

Learn more about constructors

注意:约定是大写构造函数的名称。

答案 1 :(得分:0)

混淆是因为函数可以用作可调用函数和对象构造函数。 好的做法是不要混淆两种形式,这意味着构造函数不应该用作可调用的函数。 通常,构造函数的首字母大写(只是按照惯例给代码的读者一个提示)。 基于对象的语言通常隐式地提供对调用方法的对象的引用。在Javascript中,这个引用是"这个"函数内的关键字。 请考虑以下代码。

var obj = {
    sum: 0,
    add: function(increment) {
        this.sum += increment;
        return this.sum;
    }
};

当我们调用obj.add(2)时,任何其他基于对象的语言中的解释器或编译器将执行方法add的内部调用,如下所示

add(arguments..., [this=obj]) {
    //this is the obj reference inside the method
}
add(arguments, obj);

上面只是一个伪代码,最后一个参数对我们隐藏,我们不需要显式传递它,这个参数是对调用add()方法并且可用的实际对象的引用通过"这个" keyworkd。

通常,当我们在Object范围之外声明一个函数时,它变成全局对象(通常是窗口对象)的方法(如果没有嵌套在另一个函数中,则编辑**)。所以它的调用将传递全局对象作为"这个"参考。在严格模式下,默认全局对象是未定义的,并且必须在窗口或全局对象上执行的任何操作都要显式完成。这样我们就不会无意中修改全局对象。

当我们将函数称为构造函数时,如下所示

var p1 = new Person();

Interpreter将执行类似于

的代码
var newObj = new Object();
Person(arguments..., [this=newObj]) {
    //this is the newObj reference inside the method
    return this;
}
Person(arugments..., newObj);

我希望现在有点清楚。