我对我的代码发生了什么感到有点困惑,这是我到目前为止所做的:
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
的值?我如何像常规财产一样抓住这些信息?我必须使用方法吗?
答案 0 :(得分:5)
因为this
的值不是您认为运行该代码时的值。 this
可能等于全局对象(即window
)。
由于您正在调用displayName
并通过在其前面添加Person
对象的实例来设置上下文,因此在函数内部正确设置了this
并获得了该人的姓名进行。
当然,您可以随时直接访问name
媒体资源(Sethen.name
)。
答案 1 :(得分:2)
问题是getName
不是函数,而是在构造Person.prototype.getName
对象之前首次分配Person
时分配了值的属性。因此,它无法包含任何特定Person对象的值。
您在创建原型时根本无法访问对象的实例数据,因为还没有Person
对象,因此还没有实例数据,因此this
没有指向一个Person
对象。
相反,Person.prototype.getName = this.name;
正在为prototype
对象分配值this.name
,在您的代码中window.name
或严格模式会导致错误,因为{{1}将是未定义的。
可以为原型分配函数或代码初始化期间已存在的任何数据。分配给原型的东西对于您创建的该类型的所有对象具有相同的值。这就是为它们分配函数/方法最有用的原因。
您可以通过这种方式实现它以获取给定Person对象的值:
this
另一种选择是直接访问function Person(name) {
this.name = name;
}
Person.prototype.getName() = function() {
return this.name;
}
var Sethen = new Person("Sethen");
console.log(Sethen.getName());
属性:
.name