从对象内的子对象访问属性

时间:2015-10-11 16:19:58

标签: javascript oop object

问题:我是面向对象编程的新手。最近已经做了很多关于对象的阅读,我真的很困惑如何从主对象中访问子对象的属性。

如果不清楚,我会告诉你我的意思:

JSFiddle:http://jsfiddle.net/rn3btqp0/3/

示例:

company: "Company1"

问题:正如您所看到的,我完全混淆了我认为被称为继承的过程(纠正我的错误)。什么是自由访问对象内对象属性的有效方法?

如果我的问题中的任何内容似乎不清楚或结构不合理,请告诉我,以便我做出适当的调整。

1 个答案:

答案 0 :(得分:1)

首先,这些都不是继承。这被称为“组合”,其中一个对象由其他嵌套对象组成。

查看您的代码......

示例1

// Pseudo code

obj1 = {
    xy: {
        x: 'foo',
        y: this.x + 'bar'
    }
}

这个例子是人们通常想要做的,但你根本做不到。使用对象文字初始值设定项,根本无法引用正在创建的对象;你需要等到它创建之后。具体而言,this没有与正在创建的对象相关的含义。

你需要这样做:

// Pseudo code

obj1 = {
    xy: {
        x: 'foo'
    }
}
obj1.xy.y = obj1.xy.x + 'bar'

如果您愿意,可以给y一些默认值,但不依赖于访问obj1obj1.xy

示例2

// Working

obj2 = {
    xy: (function() {
        x = 'foo',
        y = console.log(this.x + 'bar')
    })()
}

有了这个,它实际上并不起作用。 x =y =正在创建全局变量。 obj2.xy没有添加任何内容;它是undefined

示例3

// need to access stuff like this

obj1 = {
    xy: {
        x: 'foo',
        y: this.x + 'bar'
    }
    z: xy.y
}

就像 示例1 一样,无法做到这一点。上面已解释了this.x + 'bar',但即使z: xy.y确实具有有用价值,y也无效。这是因为obj.xy尚不存在。在创建时,没有隐式的方法来访问正在创建的对象。

这可行,但通常不是最佳

可以使用一些技巧,比如使用匿名构造函数,但语法更加冗长。

我会在这里展示,但我不认为这通常是最好的方式。

var obj1 = new function() {
    this.xy = new function() {
        this.x = 'foo',
        this.y = this.x + 'bar'
    }
    this.z = this.xy.y
}

现在创建的任何对象实际上都是使用临时匿名函数作为构造函数。这是因为使用new调用了这两个函数。因此,函数中this的值将是正在创建的对象,因此我们可以引用它。函数隐式返回新对象,因为这是JS在使用new调用函数时的工作方式。

传统方法

你最好只是单独创建对象。它更冗长,但更清晰。

var obj1 = {
    xy: {
        x: 'foo'
    }
}
obj1.xy.y = obj1.xy.x + 'bar'
obj1.z = obj1.xy.y

使用命名构造函数

如果您喜欢上一个函数,那么请创建实际的构造函数并调用它们。

function MyObj() {
    this.x = 'foo'
    this.y = this.x + 'bar'
}

function MyOuterObj() {
    this.xy = new MyObj()
    this.z = this.xy.y
}

var obj1 = new MyOuterObj()