0

开始在 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.

正如评论所说,这是输出“Jim”,因为 getter 是硬编码返回的。

我不想每次调用 monster.name 时都更改我的原型——我想在我的怪物实例上添加一个新的阴影属性。我该如何管理?

4

3 回答 3

3

您在 getter 函数中对“Jim”进行了硬编码,因此无论如何它都会返回“Jim”。您需要将属性的值存储在局部变量中并从那里获取它:

function Animal() {
  var myName = "Jim";
  Object.defineProperty(this, "name", {
    set: function(n) { myName = n },
    get: function() { return myName; }
  });
}

小提琴

于 2013-06-23T19:10:37.460 回答
0

使属性可配置:

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
于 2013-06-23T20:50:25.667 回答
0

我不完全确定您期望它如何工作。毕竟,你的 setter 什么都不做,你的 getter 返回一个常量。

为什么不这样做呢?

function Animal() {
    this.name = "Jim";
}

然后你可以这样做:

var monster = new Monster();
monster.name = "John";
monster.name // John
于 2013-06-23T19:10:54.847 回答