javascript - 为什么将变量(在对象范围之外)设置为等于对象方法会返回未定义的结果?

标签 javascript oop

下面的代码是从MDN page on OOP with JavaScript复制并粘贴的。我研究了使用 JavaScript 进行 OOP 的一般问题。但是,我是初学者,对此代码片段有以下疑问:

  1. Person.prototype.gender = ''; 行的用途是什么?如果我把它拿出来运行代码,我会得到相同的结果。

  2. 为什么调用 genderTeller() 会导致“未定义”警报?从初学者的 Angular 来看,MDN 的解释似乎有点单薄。这是范围问题吗?

function Person(gender) {
    this.gender = gender;
}

Person.prototype.gender = '';

Person.prototype.sayGender = function () {
    alert(this.gender);
};

var person1 = new Person('Male');
var genderTeller = person1.sayGender;

person1.sayGender(); // alerts 'Male'
genderTeller(); // alerts undefined
alert(genderTeller === person1.sayGender); // alerts true
alert(genderTeller === Person.prototype.sayGender); // alerts true

最佳答案

What is the purpose of the line Person.prototype.gender = '';? If I take it out and run the code, I get the same results.

这似乎为 gender 属性建立了默认值。有了它,即使在不调用构造函数的情况下创建实例,该属性仍然会被设置:

var person2 = Object.create(Person.prototype);
console.log(person2.gender); // ""

这在创建子类型时可能很有用:

function Employee() {}
Employee.prototype = Object.create(Person.prototype);

console.log(new Employee().gender); // ""

Why exactly does calling genderTeller() cause an 'undefined' alert?

MDN document on this应该进一步解释它,特别是“函数上下文”部分。但是,this 的值是在调用函数 时确定的,而不是由定义它的时间或位置确定的。

通过将 person1.sayGender 分配给 genderTeller,它与 person1 解除关联。因此,它不再是特定对象的“方法”。

相反,它被作为常规函数调用,this 的值默认为全局对象,即浏览器中的 window

window.gender = 'n/a';

var genderTeller = person1.sayGender;
genderTeller(); // logs: 'n/a'

关于javascript - 为什么将变量(在对象范围之外)设置为等于对象方法会返回未定义的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22446253/

相关文章:

python - 类和变量

javascript - 迭代 jQuery $(this).attr ('class' ).split ("") 给出奇怪的结果

javascript - 如何获取第 X 个最近的 SQL 查询

php - Laravel:从 Blade 模板调用 Controller 类的方法

python - 在 Python 类中单独实现每个丰富的排序方法的捷径?

c++ - 当函数调用退出并且函数在堆中生成类实例时,是否调用了析构函数?

javascript - jQuery中的宽度,innerWidth和outerWidth,height,innerHeight和outerHeight有什么区别

asp.net-mvc - ASP.NET MVC : handling no-javascript

javascript - TypeError : _this. props.menuData 不是reactjs中的函数

c++ - 这是什么设计模式?如何使用它?