从 javascript 对象访问父级的父级

IT技术 javascript oop
2021-01-29 15:15:04

就像是

var life= {
        users : {
             guys : function(){ this.SOMETHING.mameAndDestroy(this.girls); },
             girls : function(){ this.SOMETHING.kiss(this.boys); },
        },
        mameAndDestroy : function(group){ },
        kiss : function(group){ }
};

this.SOMETHING 是我想象的格式,但也可能不是。什么将退回到对象的父级?

6个回答

我只是在第一个函数中添加

parentThis = this;

并在子函数中使用 parentThis。为什么?因为在 JavaScript 中,对象是软的。可以通过简单的赋值将新成员添加到软对象(不像 IE。Java 中的经典对象很难。将新成员添加到硬对象的唯一方法是创建一个新类)更多关于这里的信息:http ://www.crockford.com/javascript/inheritance.html

而且最后你不必杀死或破坏对象。为什么我在这里找到:http : //bytes.com/topic/javascript/answers/152552-javascript-destroy-object

希望这可以帮助

我很惊讶这个答案是这里最受欢迎的答案。谁是“第一功能”?当对象是一个函数时(如在 tntu 答案中),它有效,但当对象是 OP 问题中的静态对象时则无效!parentThis 将返回Window对象
2021-03-17 15:15:04
绝对有用!谢谢你,你节省了我很多时间!
2021-03-31 15:15:04
在这里太晚了,但有人可以详细说明代码示例吗?我没有看到这对像 OP 代码这样的对象有什么帮助。
2021-04-09 15:15:04

JavaScript 本身不提供此功能。而且我怀疑您甚至可以创建这种类型的功能。例如:

var Bobby = {name: "Bobby"};
var Dad = {name: "Dad", children: [ Bobby ]};
var Mom = {name: "Mom", children: [ Bobby ]};

鲍比属于谁?

最初的问题是如何从一个对象到它的“容器”。我举了一个带有两个“容器”的对象的例子。您的示例在关系的两侧引入了多个容器。这并没有解决最初的问题,但它确实进一步证明了这样一个简单概念的复杂性。例如,(使用您的代码)如果孩子的“父”集合与父的“子”集合不同步,您将遇到真正的问题。
2021-03-25 15:15:04
“而且我怀疑你甚至可以创建这种类型的功能。” 你就去吧 Bobby.father=Dad。而且我不会让爸爸的名字是“爸爸”,这很令人困惑。“乔”或只是一些常用的名字会更好。
2021-03-26 15:15:04
与所选答案相比,这是与多个父项相关的异常情况的更清晰示例。
2021-03-31 15:15:04
好吧,如果我们想让爸爸妈妈拥有相同的属性和方法,我想我们可以通过抽象出父母的声明和孩子的设置来实现我们想要的功能。你对下面的小提琴有什么看法?jsfiddle.net/whrom/nP5eM
2021-04-07 15:15:04

在这种情况下,您可以使用life引用父对象。或者您可以life在用户对象中存储对的引用parent语言中不能有固定可用的,因为用户只是对对象的引用,可能还有其他引用......

var death = { residents : life.users };
life.users.smallFurryCreaturesFromAlphaCentauri = { exist : function() {} };
// death.residents.smallFurryCreaturesFromAlphaCentauri now exists
//  - because life.users references the same object as death.residents!

您可能会发现使用以下内容很有帮助:

function addChild(ob, childName, childOb)
{
   ob[childName] = childOb;
   childOb.parent = ob;
}

var life= {
        mameAndDestroy : function(group){ },
        kiss : function(group){ }
};

addChild(life, 'users', {
   guys : function(){ this.parent.mameAndDestroy(this.girls); },
   girls : function(){ this.parent.kiss(this.boys); },
   });

// life.users.parent now exists and points to life
似乎所有对象都可以有父成员,如果它不存在,这可能只是 null 或空对象。这只是一个愚蠢的概念吗?
2021-03-30 15:15:04
我现在明白了,谢谢 --- JavaScript 非常具有表现力,这只是另一个例子:)
2021-04-08 15:15:04
罗伯特,在我给出的例子中,谁是父母——生还是死?您可以自由地存储对父对象的引用并为其指定任何您想要的名称 - 但强制执行单父结构取决于您。
2021-04-09 15:15:04

关于电话:

您可以通过使用.call()which来解决这个问题

  • 必须在函数上调用 addName.call()
  • 你传递给它一个你想成为“这个”的对象 addName.call({"name" : 'angela'});
  • 您可以传递可以在调用它的函数中使用的其他参数,addName.call({"name": "angela"}, true);其中可能addName接受 boolean 参数append

使用调用:

对于这个特殊问题,我们可以通过“父”对象call来覆盖this子对象中通常存在的内容。

先看看我们的问题

var app = {
    init: function() {
        var _this = this; // so we can access the app object in other functions

        $('#thingy').click(function(){
            alert(_this.options.thingy());
        });

        $('#another').click(function(){
            alert(_this.options.getAnother());
        });
    },
    options: {
      thingy: function() {
      // PROBLEM: the this here refers to options
        return this.getThingy();
      },
      getAnother: function() {
        // PROBLEM 2: we want the this here to refer to options,
        // but thingy will need the parent object
        return 'another ' + this.thingy();
      },
    },
    getThingy: function() {
        return 'thingy';
    }
};

现在,这是一个解决方案 use call

JSFIDDLE看看它的工作原理。

var app = {
    init: function() {
        var _this = this; // so we can access the app object in other functions

        $('#thingy').click(function(){
            // SOLUTION: use call to pass _this as the 'this' used by thingy
            alert(_this.options.thingy.call(_this));
        });

        $('#another').click(function(){
            // SOLUTION 2: Use call to pass parent all the way through
            alert(_this.options.getAnother.call(_this)); 
        });
    },
    options: {
      thingy: function() {
        // SOLUTION in action, the this is the app object, not options.
        return this.getThingy(); 
      },
      getAnother: function() {
        // SOLUTION 2 in action, we can still access the options 
        // AND pass through the app object to the thingy method.
        return 'another ' + this.options.thingy.call(this); 
      },
    },
    getThingy: function() {
        return 'thingy';
    }
};

综上所述

.call()每当您在主对象的属性上使用方法时,您都可以使用app.options.someFunction(arg)应始终使用.call-调用app.options.someFunction.call(this, arg);- 这样您就可以确保您始终可以访问对象的每个部分。它可以让您访问另一个属性的方法,例如app.helpers.anotherFunction().

一个好主意是在somefunction, 存储this在一个变量中,_parentThis因此很明显this反映了什么

如果我正确地阅读了您的问题,通常对象对其包含的位置是不可知的。他们不知道他们的父母是谁。要找到该信息,您必须解析父数据结构。当您谈论文档中的元素对象时,DOM 为我们提供了执行此操作的方法,但看起来您谈论的是普通对象。

这就是我的理解——我想我可能只是没有意识到解决方案。
2021-03-20 15:15:04