0

我对我的代码发生了什么有点困惑,这是我到目前为止所拥有的:

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

Person.prototype.getName = this.name;
Person.prototype.displayName = function() {
    return this.name;
}


var Sethen = new Person("Sethen");

console.log(Sethen.getName);
console.log(Sethen.displayName());

我很好奇为什么getName不给我这个this.name值而只记录空白,而该displayName方法给了我正确的值。 getName是我的原型对象的一个​​属性,所以我的想法是我可以像这样抓住它。

为什么不getName记录 的值Sethen?我将如何像普通财产一样获取这些信息?我必须使用一种方法吗?

4

2 回答 2

5

因为this运行该代码时的值并不是您认为的值。this可能等于全局对象(即window)。

由于您displayName通过在其前面加上Person对象的实例来调用和设置上下文,因此this在函数内部正确设置了该人的姓名。

当然,您始终可以name直接访问该属性 ( Sethen.name)。

于 2012-12-23T16:31:42.677 回答
2

问题在于它不是一个函数,而是一个在构造对象之前首次赋值getName时被赋值的属性。因此,它不可能包含任何特定 Person 对象的值。Person.prototype.getNamePerson

在创建原型时,您根本无法访问对象的实例数据,因为还没有Person对象存在,因此还没有实例数据,因此this不指向Person对象。

相反,在您的代码中为对象Person.prototype.getName = this.name;分配prototype一个值,或者在严格模式下将导致错误,因为将是未定义的。this.namewindow.namethis

可以为原型分配函数或代码初始化期间已经存在的任何数据。分配给原型的事物对于您创建的该类型的所有对象都将具有相同的值。这就是为什么为它们分配功能/方法最有用的原因。

您可以通过这种方式实现它以获取给定 Person 对象的值:

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

Person.prototype.getName() = function() { 
    return this.name;
}

var Sethen = new Person("Sethen");

console.log(Sethen.getName());

另一种选择是直接访问该.name属性:

function Person(name) {
    this.name = name;
}
var Sethen = new Person("Sethen");
console.log(Sethen.name);
于 2012-12-23T17:13:27.477 回答