我正在阅读developer.mozilla.org 的 OOP JS 指南,并发现了以下代码片段:
function Person(gender) {
this.gender = gender;
}
Person.prototype.gender = '';
Person.prototype.sayHello = function () {
alert ('hello');
};
var person1 = new Person('Male');
var person2 = new Person('Female');
// call the Person sayHello method.
person1.sayHello(); // hello
我不明白,如果 (gender) 已经定义为 this.gender;为什么我们需要把 Person.prototype.gender = '';线?我将其理解为构造函数之外的函数,但似乎该行正在重复 this.gender;线。我知道它正在创建性别作为 Person() 对象的属性,但这不只是重复 this.gender 吗?
我希望得到任何解释,我是 OOP JS 的新手。谢谢!
通过增加Person.prototype.gender = '';
该人有一个“默认”性别。如果在实例化时未指定性别,则它更像是为 Person 定义性别。请记住,设置this.gender = gender
when gender
is 不明确的仍然算作指定一个值。
当它变得明显时,如果您尝试删除gender
您的财产。如果Person.prototype.gender = '';
is omitted,那么可能会出现以下情况:
var person1 = new Person('Male');
// check gender
person1.gender === 'Male'; // true
// remove gender property from person1
delete person1.gender;
person1.gender === undefined; // true
Because person1
不具有gender
它不再能在此 Person 实例中引用它,因此它将在 Person 构造函数中查找其原型链。它不会在那里找到它,因为在构造函数中this.gender = gender;
是一个实例属性。查找过程沿着原型链继续向上,直到找到该属性。
现在考虑一下我们是否有以下情况:
function Person(gender) {
this.gender = gender;
}
Person.prototype.gender = 'Asexual';
var person1 = new Person('Male');
var person2 = new Person('Female');
var person3 = new Person();
// check genders, looking at instance property
person1.gender === 'Male'; //true
person2.gender === 'Female'; //true
person3.gender === undefined; //true
// remove their genders
delete person1.gender;
delete person2.gender;
delete person3.gender;
// check genders again, now it's looking up the prototype chain
person1.gender === 'Asexual'; //true
person2.gender === 'Asexual'; //true
person3.gender === 'Asexual'; //true
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)