问题:我是面向对象编程的新手。最近已经做了很多关于对象的阅读,我真的很困惑如何从主对象中访问子对象的属性。
如果不清楚,我会告诉你我的意思:
JSFiddle:http://jsfiddle.net/rn3btqp0/3/
示例:
company: "Company1"
问题:正如您所看到的,我完全混淆了我认为被称为继承的过程(纠正我的错误)。什么是自由访问对象内对象属性的有效方法?
如果我的问题中的任何内容似乎不清楚或结构不合理,请告诉我,以便我做出适当的调整。
答案 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
一些默认值,但不依赖于访问obj1
或obj1.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()