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