下面的代码是使用JavaScript从OOP的MDN页面复制并粘贴的。我研究了有关使用JavaScript进行OOP的一般问题。但是,我是一个初学者,对此代码段有以下疑问:
该行的目的是Person.prototype.gender = '';
什么?如果将其取出并运行代码,则会得到相同的结果。
为什么呼叫genderTeller()
会导致“未定义”警报?从初学者的角度看,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
该行的目的是
Person.prototype.gender = '';
什么?如果将其取出并运行代码,则会得到相同的结果。
这似乎为该gender
属性建立了默认值。有了它,即使在没有调用构造函数的情况下创建实例,该属性仍会设置:
var person2 = Object.create(Person.prototype);
console.log(person2.gender); // ""
在创建子类型时,这可能会很有用:
function Employee() {}
Employee.prototype = Object.create(Person.prototype);
console.log(new Employee().gender); // ""
为什么呼叫
genderTeller()
会导致“未定义”警报?
MDN的文档this
应对此进行进一步说明,尤其是有关“函数上下文”的部分。但是,a的值this
取决于何时function
调用a而不是由定义它的时间或位置来确定。
通过分配person1.sayGender
给genderTeller
,它便与解除关联person1
。因此,它不再是特定对象的“方法”。
相反,它被称为常规函数,其值this
默认为window
浏览器中的全局对象。
window.gender = 'n/a';
var genderTeller = person1.sayGender;
genderTeller(); // logs: 'n/a'
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句