更好的子对象访问父对象的方法?

时间:2011-06-08 21:21:17

标签: javascript object parent

我有一些JS,你会在下面看到。我希望内部类对象能够访问它的父级。它需要访问父方法和属性。我完成它的方式是工作,但我想知道我是否可以在内部类构造函数中做一些事情来获取父级,而不是父级必须明确地告诉孩子它的父级是谁。看起来很笨重。

<html>
<body>
<script>
function ChildClass(name){
    //this.myParent=  no way of knowing .....
    this.myName=name;
    this.whereDidIComeFrom=function(){
        document.write(this.myName+ " came from " +this.myParent.dad+"<br>");
    }
}

function ParentClass(name){
    this.dad=name;
    this.myChild=new ChildClass(name+"son");
    this.myChild.myParent=this;   //only way I know for myChild to access parent
    this.myChild.whereDidIComeFrom();
}

var parentDavid = new ParentClass("David");
var parentJohn = new ParentClass("John");
</script>
</body>
</html>

来自运行的输出如下所示:

  戴维森来自大卫

     

约翰逊来自约翰

我问,因为上面的结构已经存在于我正在维护的项目中。我不能重新设计整个事情。现在只有子对象必须访问它的父对象。以前它不需要。最好不要更改父类,并在子项中进行所有更改。但如果我得到的基本上是“你需要做什么”,那就这样吧。

3 个答案:

答案 0 :(得分:5)

原则上,这已经是正确的方法。你可以让它更有点漂亮,在子节点中提供一个introductionParent()函数,如果已经设置了父引用,但是这不会改变问题的核心。

虽然数据模型中的子项只能属于一个父项,但Javascript不知道这一点。例如,可能有几个父母引用同一个孩子(传闻有时会发生在自然界中)。实际上,孩子不是父母的“内在阶级”。孩子和父母只是联系在一起,即“他们以某种方式相互认识”,这是一种未指明的关系,但两者都不是另一方的一部分(或财产)。

答案 1 :(得分:1)

我的偏好是在创建子项时将父项传递给子项,而不是在创建子项后将父项设置为单独的步骤。所以代码几乎和你的完全一样,除了在ChildClass函数上有一个额外的参数:

<script>
function ChildClass(name,myParent){
    this.myParent=myParent;
    this.myName=name;
    this.whereDidIComeFrom=function(){
        if (this.myParent != undefined && this.myParent.dad != undefined)
           document.write(this.myName+ " came from " +this.myParent.dad+"<br>");
        else
           document.write(this.myName+ " has no father<br>");
    }
}

function ParentClass(name){
    this.dad=name;
    this.myChild=new ChildClass(name+"son",this);
    this.myChild.whereDidIComeFrom();
}

var parentDavid = new ParentClass("David");
var parentJohn = new ParentClass("John");

当然,没有什么能阻止你在创建子项后更改父项,或者通过不传递该参数来创建具有null或未定义父项的子项。

答案 2 :(得分:0)

这种发生的经典方式是事件。您可以实现一个从事件处理程序中引出信息的事件。

在一个好的设计中,如果你想要父母的“foo”值,那么任何实现“foo”的父母都有一个共同的祖先来宣告“foo”,而祖先将是实现你的“foo”的唯一地方-handler。

你现在所介绍的是可怕的内聚力减少和耦合放大。