我正在玩物体和建造者,我很好奇为什么我不能执行:人(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);
答案 0 :(得分:0)
我得到"无法设置属性"年龄"未定义" chrome中的错误。
当您在strict mode中呼叫某个功能时,this
为undefined
。看来你想用new
:
new person(5, 10)
注意:约定是大写构造函数的名称。
答案 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);
我希望现在有点清楚。