开始在JavaScript中使用已配置的对象,这引起了一些问题。
查看此代码:
function Monster() {
}
function Animal() {
Object.defineProperty(this, "name", {
set: function(n) { },
get: function() { return "Jim"; } // hard-coded to demonstrate problem
});
}
Monster.prototype = new Animal();
var monster = new Monster();
monster.name = "John";
monster.name // Still returns Jim. I need to assign the property to THIS object, so Jim is shadowed by John.
正如评论所说,这是输出“吉姆”,因为吸气剂被硬编码返回。
每次调用monster.name时我都不想改变我的原型 - 我想在我的怪物实例上有一个新的阴影属性。我该如何管理?
答案 0 :(得分:2)
你在你的getter函数中硬编码了“Jim”,所以它总会返回“Jim”并不重要。您需要将属性的值存储在局部变量中,并从那里获取它:
function Animal() {
var myName = "Jim";
Object.defineProperty(this, "name", {
set: function(n) { myName = n },
get: function() { return myName; }
});
}
<强> FIDDLE 强>
答案 1 :(得分:1)
使属性可配置:
function Animal() {
Object.defineProperty(this, "name", {
configurable: true,
set: function(n) { },
get: function() { return "Jim"; } // hard-coded to demonstrate problem
});
}
Monster.prototype = new Animal();
var monster = new Monster();
Object.defineProperty(monster, 'name', {writable: true})
monster.name = "John";
monster.name
答案 2 :(得分:0)
我不完全确定你期望它如何工作。毕竟,你的setter什么都不做,你的getter返回一个常量。
为什么不这样做?
function Animal() {
this.name = "Jim";
}
然后你可以这样做:
var monster = new Monster();
monster.name = "John";
monster.name // John