【问题标题】:How to make an object inherit a value?如何让一个对象继承一个值?
【发布时间】:2016-08-04 00:28:09
【问题描述】:

鉴于这样的事情:

data = {'car': {'name': 'Mazda'}, 'year': 2006};

有没有办法使用 data.car.name.year

获得“2006”值

当对象本身缺少该属性时,我正在尝试使用父属性。我看过 原型设计,但似乎不是?

在其他世界中,如果在请求的级别不可用,如何访问在父级别定义的值?

【问题讨论】:

  • 看到你的结构,要获得“2006”:data.year 要获得“Mazda”:data.car.name 您应该阅读一些有关 JSON 的内容以更熟悉元素嵌套。
  • 在这种情况下,'car' 和 'year' 不是数据的子级,而是属性,它们不具有这种方式的层次关系。 “汽车”的类型本身就是一个对象,与数据没有关系。
  • 鉴于您现有的结构,它无法完成,因为一个对象可以被许多其他对象或变量引用,因此它无法知道您想要哪个。对于原型继承,它也不起作用,因为它们不能是循环的。您可以对对象本身进行显式循环引用,但是您需要向嵌套对象添加一个属性。

标签: javascript object prototype


【解决方案1】:

如果您想获取该对象的年份(“2006”),您需要像这样访问:

data.year

但是建议把你的对象改成:

data = {'car': {'name': 'Mazda','year': 2006}};

并访问:

data.car.year

【讨论】:

  • 这不是问题要问的。
  • 是的,您好,您问“有没有办法使用 data.car.name.year 获得“2006”值”我告诉那个对象没有,因为它有另一个结构
  • 这个问题不清楚,但他真正要问的不是如何获得“2006”,而是如何访问在父级别定义的值。
  • 就用 parent.propertyName 吧?如果父级上不存在该属性,它将返回 undefined
  • @Alan 你是对的,这就是我的问题。如果未在当前级别定义,如何访问已在父级别定义的值。
【解决方案2】:

你不能做 data.car.name.year 的原因是 JSON 的规则。如果你打破这个,你可以看到它更好。

选项 1:

data = {'car': 
    {
        'name': 'Mazda'
    }, 
    'year': 2006
};

现在您可以看到,如果您访问car,您将被定向到其中包含name 的对象。将其视为计算机上的文件夹结构。

/car/name = {'name': '马自达'} /汽车/年 = 2006

也许你想要的是这样的:

data = {
   'car': 
    {
        'name': 'Mazda',
        'year': 2006
    }
};

这样你就可以做到data.car.year

选项 2:

data.car.name.year = data.year 这将复制对象上的属性,但您可以将其用作data.car.name.year

另一种更复杂的方式:

您可以让对象从 javascript 中的其他对象继承。我建议使用 ES6 类或 TypeScript。

两者都需要编译成 javascript 才能在大多数浏览器中运行以获得最新功能。

来自打字稿深入研究:

class Point3D extends Point {
    z: number;
    constructor(x: number, y: number, z: number) {
    super(x, y);
    this.z = z;
}
add(point: Point3D) {
    var point2D = super.add(point);
    return new Point3D(point2D.x, point2D.y, this.z + point.z);
    }
}

这是一个类似的直接 JS 实现

var Point3D = (function (_super) {
    __extends(Point3D, _super);
    function Point3D(x, y, z) {
    _super.call(this, x, y);
    this.z = z;
}
Point3D.prototype.add = function (point) {
    var point2D = _super.prototype.add.call(this, point);
    return new Point3D(point2D.x, point2D.y, this.z + point.z);
};
    return Point3D;
})(Point);

【讨论】:

  • 你能告诉我为什么我被否决了吗?我很想听听一些建设性的反馈。尽我所能帮助你:)
  • 对象从其他对象继承远非痛苦var child = Object.create(parent),还有其他方法。尽管提出的问题是,给定所描述的结构,是否可以从被引用对象访问引用对象,答案是 no,它与 JSON 没有任何关系,这是一个基于文本的数据传输格式。
  • 我同意这远非痛苦。我会重新措辞。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-30
  • 2011-07-25
相关资源
最近更新 更多