myObject.myProperty = new myObject.AnotherObject();
不同于
myObject.myProperty = new TestObject.prototype.AnotherObject();
完全没有区别。请记住,JavaScript 中的对象有一个原型链。你打电话时new myObject.AnotherObject();
引擎将首先检查AnotherObject
on myObject
本身。找不到它,它将检查myObject
的原型,它会找到它。第二个版本
myObject.myProperty = new TestObject.prototype.AnotherObject();
就直接去那个地方AnotherObject
被定义为。
TestObject.prototype.AnotherObject = function () {
this.AnotherObject = new TestObject.prototype.AnotherObject();
}
myObject.AnotherObject();
只需浏览一下代码即可。当你说:myObject.AnotherObject();
, AnotherObject
将被调用,与this
set to myObject
。第一行将尝试创建一个新属性myObject
(这是this
)通过将其设置为结果
new TestObject.prototype.AnotherObject();
然后将重新输入相同的AnotherObject
函数,但这次是this
设置为一个新对象,其原型设置为TestObject.prototype.AnotherObject
的原型。等等无限期
最后,
TestObject.prototype.createAnObject = function() {
this.AnotherObject = new TestObject.prototype.AnotherObject();
}
myObject.createAnObject();
Will not据我所知和测试,导致无限循环:FIDDLE http://jsfiddle.net/2w68B/
基本上,createAnObject
将进入this
set to myObject
。其中有一个全新的房产,名为AnotherObject
将在 myObject 上创建,该对象将被设置为对AnotherObject
function您之前设置的。
请注意,进行此调用后,AnotherObject
function will 仍然存在, but, 这将是shadowed by the AnotherObject
property你刚刚创建的。所以现在你永远无法说
var f = new myObject.AnotherObject()
因为你现在有一个AnotherObject
property位于 myObject 上,它将在检查原型上的任何内容之前找到并返回。
嗯,我的意思是,你总是可以说delete myObject.AnotherObject
并从对象中删除该属性,然后您将可以看到AnotherObject
在原型上找到,但实际上,您应该从一开始就避免这样的名称冲突。
关于你的最后一段代码
A)为什么不做User
its own功能?
B) 为什么不设置this.User = new ...()
就在 ClientObject 构造函数中吗?这样你就不需要undefined
查看
C)ClientObject
应定义为
function ClientObject(){...`
你现在拥有的似乎正在创建一个隐式的全局。