Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从对象内的子对象访问属性_Javascript_Oop_Object - Fatal编程技术网

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

Javascript 从对象内的子对象访问属性,javascript,oop,object,Javascript,Oop,Object,问题:我对面向对象编程非常陌生。我最近读了很多关于对象的书,我真的很困惑如何从主对象中访问子对象的属性 如果不清楚,我将向您展示我的意思: JSFiddle: 示例: // Pseudo code obj1 = { xy: { x: 'foo', y: this.x + 'bar' } } // Working obj2 = { xy: (function() { x

问题:我对面向对象编程非常陌生。我最近读了很多关于对象的书,我真的很困惑如何从主对象中访问子对象的属性

如果不清楚,我将向您展示我的意思:

JSFiddle:


示例:

// Pseudo code

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

// Working

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

// need to access stuff like this

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

问题:正如你所看到的,我对我认为的所谓继承的过程完全感到困惑(纠正我,我错了)。自由访问对象内对象属性的有效方法到底是什么


如果我的问题中有任何不清楚或结构不合理的地方,请务必让我知道,以便我能够做出适当的调整。

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

查看您的代码

示例1

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

您需要这样做:

// Pseudo code

obj1 = {
    xy: {
        x: 'foo'
    }
}
obj1.xy.y = obj1.xy.x + 'bar'
如果愿意,您可以给
y
一些默认值,但没有一个默认值依赖于访问
obj1
obj1.xy


示例2

对于这个,它实际上不起作用。
x=
y=
正在创建全局变量。没有任何内容被添加到
obj2.xy
;它是
未定义的


示例3

就像例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
的值将是正在创建的对象,因此我们可以引用它。函数隐式地返回新对象,因为当使用
new
调用函数时,JS就是这样工作的


传统方法

单独创建对象确实更好。有点冗长,但更清楚

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()

@DavidLi我知道,但老实说,我并没有真正理解它,这就是为什么为了简单起见,我一直希望得到一个xy对象的例子,我一直在使用原型。这对继承很有效。哇,这是一个完美的答案。斜视,再次感谢,这是一个伟大的起点
var obj1 = new function() {
    this.xy = new function() {
        this.x = 'foo',
        this.y = this.x + 'bar'
    }
    this.z = this.xy.y
}
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()